Node.js Socket.io建立多个连接

3

我正在创建一个使用passport.js进行身份验证的简单socket.io聊天。但是每次用户注销并登录时,旧的socket连接都会重新连接。这会导致问题,因为现在有两个活动连接到同一页。所以我想在用户导航到“/logout”时结束当前连接。

var socketNotLoaded = true;
var socket;

app.get('/', function(req, res) {
    if (req.isAuthenticated()) {
        if(socketNotLoaded) { //is true when new connection is required
            require("./socket")(io,req.user) //runs the socket.io script
            socketNotLoaded = false;
        }
        res.render('index', pug.get(req.user));
    } else {
        res.render('notloggedin', pug.get());
    }
})

app.get('/logout', function(req, res) {
    socketNotLoaded = true;
    req.logout();
    res.redirect('/');
})

我正在使用以下技术:

  • socket.io版本:2.0.3
  • passport版本:0.4.0
  • passport-local版本:1.0.0
  • express版本:4.15.4
  • express-session版本:1.15.5
  • cookie-parser版本:1.4.3
  • body-parser版本:1.17.2

显然,您的网页中有客户端代码在您注销并重新连接后重新连接。这很可能是问题所在。此外,您的代码似乎只设计了一个用户。如果if(socketNoLoaded)调用使用模块级变量来决定是否使用req.user初始化socket.io。这根本没有意义。当第二个用户来到您的网站时,您希望发生什么?或者第三个用户呢? - jfriend00
谢谢,现在更有意义了。但是我该如何安全地将活动用户的详细信息传递给socket.io呢? - Rasmus Nilsson
我不知道“给它活跃用户的详细信息”是什么意思?“活跃用户详细信息”是什么,为什么你想把它们提供给socket.io服务器? - jfriend00
以前从req.user传递的信息。 - Rasmus Nilsson
你想用那些信息做什么?它是什么?不应该只是在你的session对象中吗?你的问题说你正在使用express-session。 - jfriend00
显示剩余2条评论
1个回答

0

在客户端,当用户想要注销时,您可以执行socket.emit('exit');,然后在服务器端添加一个监听器,如下所示:

socket.on('exit', function(){
    socket.disconnect();
});

这将会断开与 Socket.io 的客户端连接。您还可以在服务器端创建一个对象,将用户名映射到 Socket.io 的 socket ID,并检查该用户是否已存在。如果存在,则可以在服务器端断开该 socket ID。理想情况下,当用户注销时,客户端应发送 disconnect 到服务器。类似这样:

 $('#logout').click( function() {
            socket.disconnect();
            window.location = "/logout";
});

我已经尝试过了,但第二次登录仍然有两个活动连接。 - Rasmus Nilsson
1
客户端可以随时断开连接。它不需要向服务器发送消息告诉服务器断开连接。此外,OP的代码在注销后进行重定向,因此当前套接字连接将在重定向时被终止。 - jfriend00
正如@jfriend00所说,您可以让客户端断开连接。由于您没有提供客户端代码,因此我们不知道您是如何实现的。 - Retro Gamer
好的,假设注销操作类似于按钮点击,为该按钮创建一个事件监听器,然后调用 socket.disconnect(),最后执行重定向操作 window.location = "/logout"; - Retro Gamer
@jfriend00 已经明白了。谢谢。 - Retro Gamer
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接