Node.js + Express.js(Connect) - 从'upgrade'事件访问Session

时间:2011-08-11 10:41:48

标签: session node.js websocket connect express

我正在尝试使用Express.js框架从Node.js服务器触发的'upgrade'事件中访问会话对象。我已经正确设置了Session支持,可以从标准的.get .post .put和.delete方法中访问它。例如。

app.get('/', function(req, res) {
    req.session.test = 'Hello world'; // Works fine
    res.render('index');
});

但是,如果我在服务器上挂起'升级'事件,就像这样:

app.on('upgrade', function(req, socket) {
    var message = req.session.test; // Doesn't work
});

我无法访问会话对象。据我所知,Connect Session中间件仅挂接get / post / put / delete方法的会话,但不会挂接“升级”等自定义事件。

仅供参考,在WebSocket握手期间从客户端发出'upgrade'事件,我正在尝试从初始WebSocket握手访问会话。在握手期间,会话cookie肯定存在于HTTP头中,例如:

app.on('upgrade', function(req, socket) {
    var cookieHeader = req.headers['cookie'];
    console.log(cookieHeader);
});

...将输出Connect会话cookie。是否有可能使用原始会话cookie令牌手动构建会话对象?


更新:在与node.js IRC聊天室的某些人交谈时,显然这是非常困难或不可能的。 Connect中间件不会暴露于自定义/异常事件,例如“升级”。他们说要在Github提出一个问题,所以这就是:

https://github.com/senchalabs/connect/issues/342

1 个答案:

答案 0 :(得分:1)

由于您无权访问响应对象,因此您应该能够通过获取会话存储并使用从cookie获取的session_id调用get(session_id, callback)来查找会话对象。如果您拥有的req对象通过req.res链接到响应,您也可以实际调用正常会话中间件函数,express.js会为您做,但如果这是原始的node.js事件,此时可能尚未建立该连接。创建中间件时,您必须手动创建会话存储实例并保留对它的引用,然后将其传递给options对象中的会话中间件工厂函数。