快速会话不会持续

我正在尝试在节点中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。