我正在创建一个简单的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('/');
})
我正在使用
答案 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";
});