Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用socketio使用Sails实时显示在线/离线用户?_Javascript_Node.js_Socket.io_Chat_Sails.js - Fatal编程技术网

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

Javascript 如何使用socketio使用Sails实时显示在线/离线用户?,javascript,node.js,socket.io,chat,sails.js,Javascript,Node.js,Socket.io,Chat,Sails.js,我的实时聊天应用程序基于和。它显示所有用户以及可用的在线用户。当用户登录时,会发出UserConnected套接字,当用户断开连接时,会发出UserDisconnected套接字, config/sockets.js中的服务器端socketio代码是 onConnect: function(session, socket) { if (session.passport) { if (session.passport.user && socket.id) {

我的实时聊天应用程序基于和。它显示所有用户以及可用的在线用户。当用户登录时,会发出UserConnected套接字,当用户断开连接时,会发出UserDisconnected套接字, config/sockets.js中的服务器端socketio代码是

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
}

问题是当用户刷新页面时,它显示与另一个用户的连接和断开连接,一个主要问题是,如果一个用户登录两个不同的浏览器,并且如果任何一个浏览器关闭,则显示用户与其他用户的连接断开,但该用户实际上在另一个浏览器中可用。
我将如何修改/代码以修复这些问题?
谢谢Advance

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

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);
  },
}
它跟踪作为特定用户登录的浏览器数量。因此,您可以使用以下内容

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

@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')
),这是一个很好的实践。通过这种方式,您只能收到有关您关心的用户的通知(例如,如果您有“好友列表”)。

这是一种很好的方法。仅供参考,如果您使用的是Sails v0.10,那么
Sails.io
将被弃用以支持。谢谢您,我实际上使用的是0.10。正在进行一些重构。:)但问题是在刷新离线和在线显示的页面时,如何解决?谢谢你的帮助。还有一个问题,我能用sails.sockets.blast()代替sails.io.sockets.emit()吗