如何在nodejs,socketio中检查在线用户?

Posted

技术标签:

【中文标题】如何在nodejs,socketio中检查在线用户?【英文标题】:How to check online user in nodejs, socketio? 【发布时间】:2020-02-07 11:24:47 【问题描述】:

如何查看用户是否在线? 我知道我们可以通过“断开连接”事件来跟踪它,但我不知道如何将它保存在我的套接字服务器中。 我在 React 中编写的客户端,但它只能发送 accessToken。 谢谢

socket.on('disconnect', function () 
        console.log('user disconnected');
    );

【问题讨论】:

***.com/questions/16518153/… 【参考方案1】:

要保持在线状态,您需要将用户的在线状态保存在数据库中。

当用户连接时将其设置为在线,在断开连接时将其设置为离线。您可以使用套接字事件来发出用户在线状态,以便实时反映它

聊天工具

const redis = require('socket.io-redis');


module.exports = (socket)=>

        global.io.adapter(redis( host: redisUrl, port: redisPort));

        global.io.on('connection', (socket) => 

                  try
              //   Replace setOnlineOrOffline with your method . 
              setOnlineOrOffline(socket.handshake.query.userId,socket.id,true);
                  
                   catch(e)
                  console.error(e)
                  

  socket.on('disconnect', (a) => 
                //   Replace setOnlineOrOffline with your method . 
                   setOnlineOrOffline(null,socket.id,false);

            );

        );
;

App.js 添加

let socketio = require('socket.io');
let chatUtils = require('path-to-chat-util');

var socket = socketio(http, 
    transports: ['websocket', 'polling'],
    pingInterval: 60000
);

chatUtils(socket);

setOnlineOrOffline功能

module.exports.setOnlineOrOffline = (userId,socketId,status)=>

   if(userId)
       // save userId,socketId,status To DB, keep socketId in an array since same user can connect from multiple browser tabs.

       // your save to db method.

       // emit the status to all users using, add necessary code to send data to all users.

              global.io.emit('onlineStatus',status);

      return
    


如果您计划扩展服务器 horizontally,请使用 socket.io-redis 模块,并让 redis serverapplication servers 之外运行。

【讨论】:

以上是关于如何在nodejs,socketio中检查在线用户?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nodejs 和 Socket io

NodeJS + SocketIO 推送到移动应用

带有温度传感器的 SocketIO - 我几乎在我的 Raspberry Pi 上使用 NodeJS 和 SocketIO 完成了 DS18B20,如何提取 Promise data ?

NodeJS + SocketIO 大套接字事件管理

如何使用 Socketio-jwt node.js 对用户进行身份验证

如何在nodejs服务器上使用android socketio模块在两个人之间进行聊天?