如何在用户从帐户注销时断开事件触发(node.js + express socket.io)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在用户从帐户注销时断开事件触发(node.js + express socket.io)相关的知识,希望对你有一定的参考价值。

我有一个从账户出去的功能:

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

要使用socket.io并一起表达,我有一个中间件:

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

我有使用socket.io的功能。我只有在用户从应用程序注销时才需要断开事件触发。但是现在,当我刷新页面时,我的断开事件始终会发出:

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);     
          });
        });
};

请帮助,如何在用户从帐户注销时断开事件触发。对不起我的英语不好。

答案

disconnect事件根本不符合您的要求。只要用户导航到新页面或刷新当前页面,该事件就会触发。这就是socket.io连接在浏览器中的工作方式。给定连接属于特定页面,并且当加载新页面时,先前连接断开,然后创建新连接。你无法改变它 - 这是浏览器架构的一部分。因此,socket.io disconnect事件与用户注销时的情况完全不同,并且永远不会相同。

相反,您需要拥有自己的功能来执行注销,用户可以通过页面中的某些操作触发注销。这可以是socket.io消息,来自页面的ajax调用或导航到注销页面。这就是用户可以注销的方式,它与disconnect事件无关。

同样,connect事件只是意味着用户(可能已登录或未登录)已连接。登录状态将存储在cookie或服务器端会话中(由cookie索引)。

另一答案

您不应该为此目的使用socket.io的内置断开连接事件。只要用户与服务器的连接断开(当他离开您的站点或刷新它时发生),它就会被发出,这不等于他或她的注销。

由于您具有服务器端注销功能,因此您可以看到有人注销。

以上是关于如何在用户从帐户注销时断开事件触发(node.js + express socket.io)的主要内容,如果未能解决你的问题,请参考以下文章

Node.js + Web Socket 打造即时聊天程序嗨聊(下)

如何使用 web3.js 注销 MetaMask 帐户

当到达存储在数据库中的未来日期、时间时,如何在 Node JS 中触发事件?

当我在firebase上删除他的帐户时如何从应用程序中注销用户?

如何在计算机睡着或用户注销时触发 NSTimer

Socket.io 不会在断开连接时向房间发送消息