socket.ioparsing连接(> = 2.4.1)签名的会话cookie

使用最新版本的连接(截至2012年7月26日),我发现以下方法从socket.io获得会话ID,这将与connect-redis存储一起使用。

var express = require('express') , routes = require('./routes') , fs = require('fs') , http = require('http') , io = require('socket.io') , redis = require('connect-redis') , connect = require('express/node_modules/connect') , parseSignedCookie = connect.utils.parseSignedCookie , cookie = require('express/node_modules/cookie'); var secret = '...'; var rStore = new(require('connect-redis')(express)); //... var server = http.createServer(app); var sio = io.listen(server); sio.set('authorization', function(data, accept) { if(data.headers.cookie) { data.cookie = cookie.parse(data.headers.cookie); data.sessionID = parseSignedCookie(data.cookie['connect.sid'], secret); } else { return accept('No cookie transmitted', false); } accept(null, true); }); 

data.sessionID可以在以后使用,如

 sio.sockets.on('connection', function(socket) { console.log('New socket connection with ID: ' + socket.handshake.sessionID); rStore.get(socket.handshake.sessionID, function(err, session) { //... }); }); 

不得不从快递(连接,连接的实用程序和cookie模块)中导入如此多的东西,似乎是一种过于迂回的方式来获取parsing连接的签名cookie所需的function。 有没有人find另一种方式?

我碰到了一样,只是写了一个小模块来抽象它。 以下是它的用法。 它使用Express 3编写和testing,所以应该连接2.4.x. 请不要让我知道。

 var SessionSockets = require('session.socket.io') , sessionSockets = new SessionSockets(io, sessionStore, cookieParser); sessionSockets.on('connection', function (err, socket, session) { //your regular socket.io code goes here }); 

有关如何工作的更多细节,请参阅https://github.com/wcamarao/session.socket.io