Как проверить онлайн пользователя в nodejs, socketio? - PullRequest
0 голосов
/ 10 октября 2019

Как я могу проверить, что пользователь в сети или нет? Я знаю, что мы можем отследить это по событию «отключить», но я не знаю, как сохранить его на своем сокет-сервере. Клиент, который я написал в React, но он может только отправить accessToken. Спасибо

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

1 Ответ

0 голосов
/ 10 октября 2019

Чтобы сохранить онлайн-статус, необходимо сохранить онлайн-статус пользователя в базе данных.

, когда пользователь подключен, установить его как онлайн, а при отключении установить его как офлайн. Вы можете использовать событие сокета для отправки статуса пользователя в сети, чтобы он отображался в режиме реального времени

chatUtils

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 serverработает за пределами application servers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...