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!!!
The best thing to do is to keep track of the connected clients in an object. Here's how I would achieve this:
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.