【问题标题】:Express session variables don't persist across requests快速会话变量不会在请求中持续存在
【发布时间】:2016-04-12 07:38:38
【问题描述】:

我正在尝试使用express-session 模块让会话变量在我的 Express Node.js 项目中工作。我没有收到任何错误,并且设置会话变量似乎有效,但是它们不会在请求中持续存在。这是我的代码的简化部分:

server.js

var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');

var app = express();

app.use(bodyParser.json());
// Sessions
app.use(session({
    secret: config.secret
}));

app.use('/api/projects', require('./controllers/api/projects'));

var server = app.listen(3000, function() {
    console.log('Server listening on', 3000)
});

api/projects.js 路由器

var router = require('express').Router()

router.get('/set', function(req, res, next) {
    req.session.test = "test";
    res.status(200).json({"test":req.session.test});
});

router.get('/current', function(req, res, next) {
    res.status(200).json({"test":req.session.test});
})

设置变量似乎可行...

/set API 调用应设置一个名为 test 的会话变量。当我尝试使用 curl 时,此 API 调用似乎有效:

curl -X GET localhost:3000/api/projects/set --cookie "connect.sid=s%3AyP3a8siRuA-5jDxWH4T03UxNpFd6lfBq.Ha8b8eJxbtW8fAJlbgR9jumfmBpJIXNE6444fOb2Jro"
{"test":"test"}

这也在控制台日志中得到确认:

Session {
  cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  test: 'test' }

...但是下次我检查它时它没有设置

当我尝试使用第二个 API 调用检查变量时,它似乎未声明:

curl -X GET localhost:3000/api/projects/current --cookie "connect.sid=s%3AyP3a8siRuA-5jDxWH4T03UxNpFd6lfBq.Ha8b8eJxbtW8fAJlbgR9jumfmBpJIXNE6444fOb2Jro"
{}

这在控制台日志中得到确认,test 变量不再设置:

Session {
  cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }

如何确保我的会话变量在请求中保持不变?

(PS:我在这个问题上停留了一段时间,非常欢迎对提示或解决方案提出任何小的评论,即使你不确定自己是否得到答案)

【问题讨论】:

    标签: javascript node.js express session-variables express-session


    【解决方案1】:

    我可以看到两个可能的原因。


    首先,您可能在 curl 中弄乱了 cookie。

    您可以通过检查 http 响应来确保您已正确设置 cookie。如果它包含带有新 connect.sidSet-Cookie 标头,那么您做错了。

    或者,您可以使用支持本机 cookie 的网络浏览器来防范此类错误。


    其次,您可能在两次请求之间重新启动了服务器。

    由于您没有为会话指定任何持久存储,因此在 node.js 服务器重新启动之间不会保留任何数据。

    如果您希望在 node.js 服务器停止或重新启动后保留会话数据,您应该考虑使用一些持久会话存储(即redis-store)。

    【讨论】:

    • 我记得,您只能获取会话 ID,并通过提供的 ID 从会话存储中获取实际数据,或者我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多