Reputation: 8608
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!!!
Upvotes: 1
Views: 5942
Reputation: 63653
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.
Upvotes: 7