在Express.js中使用Session MemoryStore未定义req.session

6

我已经使用Express.js搭建了一个Node.js测试服务器,代码如下:

var express     = require('express');
var MemoryStore = express.session.MemoryStore;
var app         = express.createServer();

app.configure(function() {
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(app.router);
    app.use(express.session({
        store: new MemoryStore(),
        secret: 'secret',
        key: 'bla'
    }));
});

app.get('/', function(req, res){
    console.log(req.session);
    res.end("html");
});

app.listen(3000);

为什么 console.log(req.session) 输出 undefined?我使用的不正确吗?为了将变量保存到用户会话中,我需要做些什么?

客户端接收一个作为 cookie 存储的 SID,但是我不能给 req.session 分配任何属性,因为它未定义。感谢任何解决此问题的提示!:-)

以下是我正在使用的版本:

├─┬ express@2.5.9
│ ├─┬ connect@1.8.7
│ │ └── formidable@1.0.9
│ ├── mime@1.2.4
│ ├── mkdirp@0.3.0
│ └── qs@0.4.2

你使用的 Express 版本是哪个? - mihai
不使用MemoryStore,它能正常工作吗? - Jonathan Ong
@mihai:抱歉忘记提到版本 - 我现在已经编辑到我的帖子中了。@Jonathan:省略store: new MemoryStore()这一行不会改变任何东西。可惜我没有另一个会话存储可以测试它是否有效。 - YMMD
2个回答

20
这是您的问题: app.use(app.router) 将您的路由挂载在调用链中的该位置。您将其放在会话中间件之前,因此没有 req.session。如果您不使用它,您的路由将在您执行第一个 app.get(或 app.post 等)时放置。如果您仍希望控制路由应该出现的位置,只需将 app.use(app.router) 移至会话中间件下方。
请参见Express的 配置中间件 文档。

你说得对,删除后一切都按预期工作了。你的回答当然和Mihai的一样好,但我接受了他的回答,因为他先回答了。非常感谢你这个精彩的解释!! :-) - YMMD

2

我不知道app.router是什么,但它似乎是问题的原因。删除那一行使它在我的情况下起作用。


好吧,我不知道是什么魔法把这行代码放进去的。 :D 谢谢,删除它有所帮助,我的路由仍然可以正常工作。 - YMMD
2
似乎在使用express.session作为会话存储之前使用use(app.router)会导致其出现问题,将其放在后面则可以正常工作。FYI :) - 0x6A75616E
2
@Linus G Thiel下面的回答更为恰当。 - clayzermk1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接