14

我已按照本指南: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每个会话并检查它是否与当前正在验证的用户相同。

4

2 回答 2

7

在我的应用程序中,我明确地管理 socket.io 会话。在服务器端,每当建立新连接时,我都会执行以下操作:socketio_session[user_id].push(session). 这使我可以访问为特定用户连接的所有会话。在您的情况下,您可能不需要存储每个用户的会话列表,而只存储最新会话并onconnect在存储新会话之前强制断开现有会话(如果有)。

于 2012-05-09T06:02:00.217 回答
0

Socket.IO上有很多代码已经老了。

新文档(Socket.IO 1.3.6,现在)说:

“旧的 io.set () 和 io.get () 方法已被弃用,仅支持向后兼容。这里是一个示例授权旧样式到中间件的翻译。” 在“从 0.9 迁移”部分

如果您使用新版本的 Socket.IO。您需要的代码类似于:

    var sessionStore    = new MongoStore({ url: config.db });
    var cookie          = require('cookie-parser')("SECRET");
    io.use(function(socket, callback) {
        if (socket.request.headers.cookie) {
            cookie(socket.request, null, function(err) {
                sessionStore.get(socket.request.signedCookies["connect.sid"], function(err, session) {
                    if (err || !session) {
                      callback('Session error', false);
                    } else {
                      socket.request.sessionID = socket.request.signedCookies["connect.sid"];
                      console.log(socket.request.sessionID);
                      callback(null, true);
                    }
                  });
            });
        }
        else {
            return callback('No session.', false);
        }
    });
    io.on('connection', function(socket) {
        console.log(socket.request.sessionID);
    });
于 2015-09-22T04:55:34.190 回答