Чтобы сохранить онлайн-статус, необходимо сохранить онлайн-статус пользователя в базе данных.
, когда пользователь подключен, установить его как онлайн, а при отключении установить его как офлайн. Вы можете использовать событие сокета для отправки статуса пользователя в сети, чтобы он отображался в режиме реального времени
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
.