anna
anna

Reputation: 433

how to make to disconect event fires only when users log out from account (node.js + express+ socket.io)

I have a function to go out from account:

exports.logout = function(req,res){
    req.session.destroy( err => {
        if(err)
            console.log(err);
       res.redirect("/login");
    });
 };

To use socket.io and express together I have a middleware:

io.use(function(socket, next) {
  sessionMiddleWare(socket.request, socket.request.res, next);
});

And I have function where I use socket.io. I need to disconect event fires only when user log out from application. But now my disconect event is emit always when I refresh a page:

exports.someFunction = function (io) {

    io.on('connection', function(socket){
        console.log(`Client connected socketId = ${socket.id}`);
        console.log("session_id: " + socket.request.session.session_id);
        usersMap.set(socket.request.session.session_id, socket.id);

       });
          socket.on('disconnect', function(){
             usersMap.delete(socket.request.session.session_id);
             console.log('user disconnected');
             console.log("Map size: " + usersMap.size);     
          });
        });
};

Please help, how to make to disconect event fires only when users log out from account. Sorry for my English.

Upvotes: 0

Views: 1580

Answers (2)

jfriend00
jfriend00

Reputation: 707238

The disconnect event simply does not work the way you are asking for. That event will fire any time the user navigates to a new page or refreshes the current page. That's how socket.io connections work in the browser. A given connection belongs to a particular page and when a new page is loaded, the prior connection is disconnected and then a new connection is created. There is nothing you can do to change that - that's part of the browser architecture. So, the socket.io disconnect event is simply not the same thing as when your user logs out and can never be the same.

Instead, you need to have your own function that does a logout which the user can trigger by some action in the page. This can be either a socket.io message, an ajax call from your page or by navigating to the logout page. That's how a user can logout and it has nothing to do with the disconnect event.

Similarly, a connect event just means that a user (who may or may not already be logged in) has connected. The login state will be stored in either a cookie or in a server-side session (that is indexed by a cookie).

Upvotes: 1

Maciej Kozik
Maciej Kozik

Reputation: 176

You should not use socket.io's builtin disconnect event for that purpose. It will be emitted whenever user's connection to the server drops (that happens when he leaves your site or refreshes it), which is not equivalent to him or her logging out.

Since you have a server side logout function, that's the place you can see somebody logged out.

Upvotes: 2

Related Questions