我已按照本指南:http : //www.danielbaulig.de/socket-ioexpress/ 将 express.js 链接到 socket.io,并且效果很好。
我让用户在一个页面上登录(设置会话对象的 express.js POST 请求),当他们通过身份验证时,它会将他们引导到加载 socket.io 的新页面,并且服务器上的 socket.io 可以获取会话是从快递设置的。这样一切正常。
现在我在使用 socket.io 的页面上有用户,当刷新该页面时 - 有时 socket.io 连接仍然存在(即它不会断开连接)。我想要做的是改变io.set('authorization')
函数以确保当用户连接时 - 它会断开仍然对该客户端开放的所有现有 socket.io 实例。
这是它目前的样子:
//socket.io connect to express
var parseCookie = require('connect').utils.parseCookie;
io.set('authorization', function (data, accept) {
if (data.headers.cookie)
{
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['express.sid'];
// (literally) get the session data from the session store
sessionStore.get(data.sessionID, function (err, session)
{
if (err || !session)
{
// if we cannot grab a session, turn down the connection
//note: a session is created when the user logs in
accept('Error', false);
}
else
{
//TODO something here before we accept the connection
//??
// save the session data
data.session = session;
//accept the connection
accept(null, true);
}
});
}
else
{
return accept('No cookie transmitted.', false);
}
});
如何检查即将被接受的客户端是否有以前的连接,并且它仍然是打开的(因此我们需要断开那个旧的连接)。
express 会话中有一个“用户名” - 所以我们可以获取会话对象并获取用户名,我只是不知道如何浏览所有 socket.io 客户端的列表并查看 express每个会话并检查它是否与当前正在验证的用户相同。