如何使用socketio实时显示在线/离线用户使用Sails?

我的实时聊天应用程序基于Sails和SocketIO。它显示所有用户以及可用的在线用户。当用户login时,发出UserConnected套接字,当用户断开连接时,发出UserDisconnected套接字,My Server side socketio代码在config / sockets.js是

onConnect: function(session, socket) { if (session.passport) { if (session.passport.user && socket.id) { sails.io.sockets.emit('UserConnected', {userID : session.passport.user}); } } //// By default: do nothing //// This is a good place to broadcast a disconnect message, or any other custom socket.io logic }, onDisconnect: function(session, socket) { if (session.passport) { if (session.passport.user && socket.id) { sails.io.sockets.emit('UserDisconnected', {userID : session.passport.user}); } } //// By default: do nothing //// This is a good place to broadcast a disconnect message, or any other custom socket.io logic } 

问题是,当一个用户刷新页面,它显示连接和断开连接到另一个用户,一个主要问题是,如果一个用户login两个不同的浏览器,如果任何一个浏览器closures显示用户断开连接到其他用户,但用户实际上在其他浏览器中可用。
我将如何修改/代码,以便这些问题将得到解决?
提前致谢

@InternalFX贴出了一个不错的方法; 您可以在Sails v0.10.x上使用的替代方法是:

  onConnect: function(session, socket) { // If this is a logged in user, subscribe the socket to a // custom "loggedInCount" room if (session.user) { var roomName = 'loggedIn'+session.user.id; sails.sockets.join(socket, roomName); // If this is the first subscriber, the user is just coming online, // so notify any subscribers about the state change. if (sails.sockets.subscribers(roomName).length == 1) { User.message(session.user.id, {state: 'online'}, socket); } } }, onDisconnect: function(session, socket) { if (session.user) { var roomName = 'loggedIn'+session.user.id; sails.sockets.leave(socket, roomName); // If this was the last subscriber, the user is going offline, // so notify any subscribers about the state change. if (sails.sockets.subscribers(roomName).length == 0) { User.message(session.user.id, {state: 'offline'}, socket); } } }, 

这使用Sails的内置pubsub体系结构来在特定用户上线或下线时通知连接的套接字。 它需要套接字来订阅他们想知道的用户实例(在客户端使用类似socket.get('/user')东西),这是一个很好的练习。 通过这种方式,您只能通知您关心的用户(例如,如果您有“好友列表”)。

这是我用于类似目的的方法。

 var online_users = {}; module.exports.sockets = { onConnect: function(session, socket) { if (_.isString(session.user_id)) { if (_.has(online_users, session.user_id)) { online_users[session.user_id] += 1; } else { online_users[session.user_id] = 1; } } sails.io.sockets.emit('crm/online_users', online_users); }, onDisconnect: function(session, socket) { if (_.isString(session.user_id)) { if (_.has(online_users, session.user_id)) { online_users[session.user_id] -= 1; } else { online_users[session.user_id] = 0; } } sails.io.sockets.emit('crm/online_users', online_users); }, } 

它跟踪有多less浏览器以特定用户身份login。 所以你可以使用以下。

 if (online_users[session.user_id] > 0) { console.log('USER IS LOGGED IN'); }`