【问题标题】:Node.js + Express.js (Connect) - Accessing Session from 'upgrade' eventNode.js + Express.js(连接) - 从“升级”事件访问会话
【发布时间】:2011-10-24 20:46:14
【问题描述】:

我正在尝试从使用 Express.js 框架的 Node.js 服务器触发的“升级”事件中访问会话对象。我已经正确设置了 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 握手期间从客户端发出“升级”事件,我正在尝试从初始 WebSocket 握手访问会话。握手期间会话​​ cookie 肯定存在于 HTTP 标头中,例如:

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

...将输出连接会话cookie。有没有办法使用原始会话 cookie 令牌手动构建会话对象?


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

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

【问题讨论】:

    标签: session node.js websocket connect express


    【解决方案1】:

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

    【讨论】:

    • 我可能会按照您的建议尝试使用会话存储创建会话。但该事件是在 node.js 级别挂钩的。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多