我有一个聊天,我需要管理独特的连接。我四处搜索,但我发现的所有解决方案似乎都已被弃用。
那么,如何使用 Socket.IO 获取套接字的会话 ID?
我正在使用Node.js、Express.js和Socket.IO。
我有一个聊天,我需要管理独特的连接。我四处搜索,但我发现的所有解决方案似乎都已被弃用。
那么,如何使用 Socket.IO 获取套接字的会话 ID?
我正在使用Node.js、Express.js和Socket.IO。
使用 Socket.IO 身份验证设置,并将 cookie 从 Express 传递给 cookie 解析器中间件。解析 cookie 后,您可以获取客户端的会话 ID,并从会话存储中获取关联的会话,无论是内存故事还是其他类型的存储。
// we need to use the same secret for Socket.IO and Express
var parseCookie = express.cookieParser(secret);
var store = /* your MemoryStore, RedisStore, etc */;
io.set('authorization', function(handshake, callback) {
if (handshake.headers.cookie) {
// pass a req, res, and next as if it were middleware
parseCookie(handshake, null, function(err) {
handshake.sessionID = handshake.signedCookies['connect.sid'];
// or if you don't have signed cookies
handshake.sessionID = handshake.cookies['connect.sid'];
store.get(handshake.sessionID, function (err, session) {
if (err || !session) {
// if we cannot grab a session, turn down the connection
callback('Session not found.', false);
} else {
// save the session data and accept the connection
handshake.session = session;
callback(null, true);
}
});
});
} else {
return callback('No session.', false);
}
callback(null, true);
});
每次客户端尝试连接时,都会运行授权功能。它获取握手标头 cookie ( handshake.headers.cookies
),并将它们传递给express.cookieParser()
. cookie 解析器然后找到会话 ID,然后搜索store
关联的会话。然后,我们将关联的会话存储到 中handshake.session
,因此我们可以像这样访问它:
app.get('/', function(req, res) {
req.session.property = 'a value';
});
io.sockets.on('connection', function(socket) {
var session = socket.handshake.session;
session.property // a value
});