快速会话变量不会在请求

时间:2016-01-07 19:07:13

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

我正在尝试使用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:我已经坚持了一段时间,对提示或解决方案的任何小评论都非常受欢迎,即使你不确定你有答案) < / p>

1 个答案:

答案 0 :(得分:1)

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

首先,您可能会在curl中搞乱使用Cookie。

您可以通过检查http响应来确保正确设置Cookie。如果它包含带有新Set-Cookie的{​​{1}}标题,那么您就做错了。

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

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

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

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