node.js - sgdq - Comment obtenir un client socket pour un utilisateur?



sgdq 2018 schedule (1)

J'implémente un serveur node.js qui gère les bi-connexions entre utilisateurs avec socket.io (version: 0.8.7). J'utilise un tableau qui stocke les utilisateurs qui n'ont pas encore de partenaires de chat. Lorsqu'un utilisateur demande un nouveau partenaire, l'application sélectionne un utilisateur dans ce tableau, puis vérifie si l'utilisateur est toujours connecté. Et voici mon problème:

Je n'arrive pas à obtenir le client socket pour l'utilisateur, même si l'utilisateur est toujours connecté. Voici un extrait de mon code:

// An array of users that do not have a chat partner
var soloUsers = [];

var io = sio.listen(app);

io.sockets.on('connection', function (socket) {


    socket.on('sessionStart', function (message) 
    {       
        // Parse the incoming event
        switch (message.event) {

            // User requested initialization data
            case 'initial':
                ...

        // User requested next partner
        case 'next':

        // Create a "user" data object for me
        var me = {
            sessionId: message.data.sessionId,
            clientId: socket.sessionid
        };

        var partner;
        var partnerClient;

        // Look for a user to partner with in the list of solo users
        for (var i = 0; i < soloUsers.length; i++) 
        {
            var tmpUser = soloUsers[i];

            // Make sure our last partner is not our new partner
            if (socket.partner != tmpUser) 
            {
                // Get the socket client for this user
                partnerClient = io.sockets.clientsIndex[tmpUser.clientId];

                // Remove the partner we found from the list of solo users
                soloUsers.splice(i, 1);

                // If the user we found exists...
                if (partnerClient) 
                {
                    // Set as our partner and quit the loop today
                    partner = tmpUser;
                    break;
                }
            }
        }

        ...

J'ai l'erreur suivante:

partnerClient = io.sockets.clientsIndex[clientId];
                                       ^
TypeError: Cannot read property 'undefined' of undefined

J'ai fait une sortie (console.log) du clientId, et il est définitivement indéfini. De plus, je pense que l'API pourrait avoir changé dans la version 0.8 de socket.io, et vous ne pouvez plus utiliser la méthode "clientsIndex". Est-ce que quelqu'un sait le remplacement?

Merci!!!


La meilleure chose à faire est de garder une trace des clients connectés dans un objet. Voici comment je réaliserais ceci:

var clients = {};

io.sockets.on('connection', function (socket) {
  // remember the client by associating the socket.id with the socket
  clients[socket.id] = socket; 
  socket.on('sessionStart', function (message) {
    // get the socket.id of the partner on each message
    var partner = message.from; 
    if (clients[partner]) {
      // check if the partner exists and send a message to the user
      clients[socket.id].emit('message', { from: partner, msg: message });
    }
  }

  socket.on('disconnect', function() {
    delete clients[socket.id]; // delete the client from the list
  });
}

Remarque: Dans une application de production réelle, vous devez normalement vérifier les données de session et associer chaque client à un nom d'utilisateur et à un socket.id.





socket.io