0

How can I check user is online or not? I know we can track it by 'disconnect' event, but I don't know how to save it in my socket server. The client that i wrote in React, but it can only send accessToken. Thanks

socket.on('disconnect', function () {
        console.log('user disconnected');
    });
phantom1006
  • 21
  • 2
  • 3

1 Answers1

3

To keep the online status, you need to keep the users's online status in the database.

when a user is connected set it as online and on disconnect set it as offline. You can use a socket event to emit the users online status so that it will be reflected realtime

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 add

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

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

chatUtils(socket);

setOnlineOrOffline Function

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
    }

}

If you planning to scale the server horizontally, use socket.io-redis module, and keep a redis server running outside the application servers.

ArUn
  • 1,317
  • 2
  • 23
  • 39