快递会话不会持久

时间:2012-11-17 01:38:22

标签: javascript node.js express

我正在尝试在节点中设置基本会话系统。这是我到目前为止所得到的:

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。我觉得我错过了一些非常基本的东西。各种各样的教程要么太糟糕要么要求我添加更多的包(我正试图避免)。

我调试的更多数据:

  • 这适用于非AJAX请求
  • 会话在记录之前设置。

4 个答案:

答案 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。