Node.js Socket.io设置多个连接

时间:2017-09-12 21:19:48

标签: javascript node.js express socket.io passport.js

我正在创建一个简单的socket.io聊天,它使用passport.js进行身份验证。但每次用户注销并登录时,旧的套接字连接都会重新连接。这会导致问题,因为现在有两个活动连接到一个页面。所以我想要做的是当用户导航到" / 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
  • 护照: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

1 个答案:

答案 0 :(得分:0)

在用户想要注销的客户端,你可以执行socket.emit('exit');,然后在服务器端有一个像这样的监听器:

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

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

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