我有一个引用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 /更改
答案 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
变量会破坏你的会话处理,因为在很多情况下它会被其他人的会话覆盖。