Node.js:无法存储req.session作为参考

时间:2015-01-04 12:01:06

标签: javascript node.js session express

我有一个引用a对象的变量req.session,但是,当我稍后更改req.session个对象时,它在a中没有更改,为什么?

var a;

app.post('/set', function(req, res){
    a = req.session; // now a is a reference to req.session
    res.end();
});

app.post('/change', function(req, res){
    req.session.changed = true;
    console.log(a); // a has no attribute 'changed', why?
    res.end();
});

要执行我先做POST /设置,然后我做了POST /更改

2 个答案:

答案 0 :(得分:1)

它没有以您期望的方式工作,因为会话对象将根据请求重新创建。这行代码

req.session.changed = true;

添加了object-specific property,这意味着它只会在该特定req.session对象上设置,而req.session的所有其他实例都不会更改。如果您希望 req.session的所有实例具有changed属性,那么您需要将 prototype 属性添加到基础类型,例如

SessionType.prototype.changed = true;

但是,您应该在此处重新考虑您的方法,因为如果发出2个后续POST /set请求,则您无法保证在POST /change中将使用正确的会话。

答案 1 :(得分:0)

设置a = req.session;时,您将变量a设置为当前req.session对象包含的内容。因此,当您访问POST /change时,变量a与您在req.session中设置的POST /set所包含的值仍然相同。

要解决此问题,您必须在a = req.session;中再次设置POST /change,如下所示:

app.post('/change', function(req, res){
    req.session.changed = true;
    a = req.session;
    console.log(a); // a has no attribute 'changed', why?
    res.end();
});

我不明白你为什么要这样做,因为在生产中使用a变量会破坏你的会话处理,因为在很多情况下它会被其他人的会话覆盖。