我正在尝试在节点中设置基本会话系统。这是我到目前为止所得到的:
app.js:
app.use(express.cookieParser('stackoverflow'));
app.use(express.session());
我在ajax.js中设置会话数据:
addClassToCart: function(req, res) {
req.session.cart = req.body.classId;
console.log(req.session.cart);
}
这会记录正确的信息。但是,当我尝试在其他地方检索该信息时(相同的文件,不同的功能):
console.log(req.session.cart);
我得到undefined
。我觉得我错过了一些非常基本的东西。各种各样的教程要么太糟糕要么要求我添加更多的包(我正试图避免)。
我调试的更多数据:
答案 0 :(得分:5)
事实证明,问题不在于Express'会话(正如其他答案似乎认为的那样)。相反,这是我的误解。我将addClassToCart
更改为以下内容:
addClassToCart: function(req, res) {
req.session.cart = req.body.classId;
console.log(req.session.cart);
res.send('class added');
}
添加res.send()
解决了问题。
答案 1 :(得分:2)
正如the answer to a related SO question中所述,如果您使用fetch从服务器获取数据但未通过credentials
选项,也会出现这种情况:
fetch('/addclasstocart', {
method: 'POST',
credentials: 'same-origin' // <- this is mandatory to deal with cookies
})
除非您包含此选项,否则Cookie将无法传递到服务器,这意味着每次新呼叫都会重置请求的会话对象。
答案 2 :(得分:-1)
我不知道基本会话存储,但redis只花了我几分钟来设置:
app.use(express.session({
store: new RedisStore({
host: cfg.redis.host,
db: cfg.redis.db
}),
secret: 'poopy pants'
}));
在mac上:
brew install redis
答案 3 :(得分:-1)
app.use(express.session({
secret: "my secret",
store: new RedisStore,
cookie: { secure: false, maxAge:86400000 }
}));
不确定问题出在会话时代,但为了安全起见,我建议您指定maxAge。