6

我正在尝试在 node.js 中建立一个基本的会话系统。这是我到目前为止所得到的:

应用程序.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

4 回答 4

6

事实证明,问题不在于 Express 的会话(正如其他答案似乎认为的那样)。相反,这是我的一个误解。我更改addClassToCart为以下内容:

addClassToCart: function(req, res) {
    req.session.cart = req.body.classId;
    console.log(req.session.cart);
    res.send('class added');
  }

添加res.send()解决了问题。

于 2012-11-17T19:27:13.130 回答
2

相关 SO question 的回答中所述,如果您使用fetch从服务器获取数据但未传入credentials选项,也会发生这种情况:

fetch('/addclasstocart', {
    method: 'POST',
    credentials: 'same-origin' // <- this is mandatory to deal with cookies
})

除非您包含此选项,否则 Cookie 不会传递到服务器,这意味着请求的会话对象将在每次新调用时重置。

于 2017-01-24T16:59:46.497 回答
-1

我不了解基本会话存储,但 redis 只花了我几分钟的时间来设置:

  app.use(express.session({
    store: new RedisStore({
      host: cfg.redis.host,
      db: cfg.redis.db
    }),
    secret: 'poopy pants'
  }));

在 Mac 上:

brew install redis
于 2012-11-17T02:03:57.327 回答
-2
app.use(express.session({
  secret: "my secret",
  store: new RedisStore,
    cookie: { secure: false, maxAge:86400000 }
}));

不确定问题出在会话年龄中,但为了安全起见,我建议您指定 maxAge。

于 2012-11-17T19:23:59.137 回答