快速会话不会持续
我正在尝试在节点中build立一个基本的会话系统。 这是迄今为止我所得到的:
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); }
这logging了正确的信息。 但是,当我尝试在其他地方(相同的文件,不同的function)检索该信息时:
console.log(req.session.cart);
我弄undefined
明白 我觉得我失去了一些非常基本的东西。 各种各样的教程是可怕的或要求我添加更多的包(我试图避免的东西)。
从我的debugging更多的数据:
- 这适用于非AJAX请求
- 会话在logging之前设置。
事实certificate,这个问题不是Express的会议(正如其他答案似乎认为)。 相反,这是我的一个误解。 我将addClassToCart
更改为以下内容:
addClassToCart: function(req, res) { req.session.cart = req.body.classId; console.log(req.session.cart); res.send('class added'); }
添加res.send()
修复了这个问题。
正如在相关的SO问题的答案中指出的那样,如果您使用获取从服务器获取数据,但不传入credentials
选项,也会发生这种情况:
fetch('/addclasstocart', { method: 'POST', credentials: 'same-origin' // <- this is mandatory to deal with cookies })
除非您包含此选项,否则Cookie将不会传递到服务器,这意味着请求的会话对象将在每次新呼叫时重置。
我不知道基本会话存储,但redis只花了我几分钟的时间来设置:
app.use(express.session({ store: new RedisStore({ host: cfg.redis.host, db: cfg.redis.db }), secret: 'poopy pants' }));
在Mac上:
brew install redis
app.use(express.session({ secret: "my secret", store: new RedisStore, cookie: { secure: false, maxAge:86400000 } }));
不知道问题出现在会话年龄,但它只是为了安全,我build议你指定maxAge。