How to get socket client for a user?
Problem
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
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!!!
Solution
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.
Discussion
View additional discussion.