1

I'm implementing a node.js server that manages bi-connections between users with socket.io (version:0.8.7). I use an array that stores the users that have no chat partners yet. When a user requests a new partner, the app picks a user in this array and then checks to see if the user is still connected. And here's my problem:

I can't manage to get the socket client for the user, even if the user is still connected. Here's a snippet of my 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; } } } ... 

I get the following error:

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

I did an output (console.log) of the clientId, and it is definitely indefined. Furthermore, I think the API might have changed in socket.io version 0.8, and you can't use the "clientsIndex" method anymore. Does anyone know the replacement?

Thanks!!!

4
  • What exactly are you trying to achieve with partnerClient? Commented Jan 3, 2012 at 21:55
  • I want to be sure the partner is still connected before assigning him to the user. Commented Jan 3, 2012 at 22:01
  • I've added an answer while you were editing the post. By the way, looping through an array of clients isn't that good, imagine how slow that would be if you had 10.000 clients for example. That would block the Node.js event loop. Commented Jan 3, 2012 at 22:04
  • You're quite right. But the loop stops once it finds a new user, so the loop won't last more than 2 iterations. Commented Jan 3, 2012 at 22:14

1 Answer 1

7

The best thing to do is to keep track of the connected clients in an object. Here's how I would achieve this:

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 }); } 

Note: In a real production application you would normally check for the session data and associate each client with a username and a socket.id.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.