Express 会话变量不会跨请求持续存在
Express session variables don't persist across requests
我正在尝试使用 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: 我已经坚持了一段时间,非常欢迎任何关于提示或解决方案的小评论,即使你不确定你有答案)
我可以看出两个可能的原因。
首先,您可能在 curl
中弄乱了 cookie。
您可以通过检查 http 响应来确保您已正确设置 cookie。如果它包含 Set-Cookie
header 和新的 connect.sid
那么你做错了。
或者,您可以使用支持本机 cookie 的网络浏览器来防止此类错误。
其次,您可能在两次请求之间重新启动了服务器。
由于您没有为 session 指定任何持久性存储,因此在 node.js 服务器重新启动之间不会保留任何数据。
如果您希望 session 数据在 node.js 服务器停止或重新启动后仍然存在,您应该考虑使用一些持久性 session 存储(即 redis-store
)。
我正在尝试使用 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
:
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: 我已经坚持了一段时间,非常欢迎任何关于提示或解决方案的小评论,即使你不确定你有答案)
我可以看出两个可能的原因。
首先,您可能在 curl
中弄乱了 cookie。
您可以通过检查 http 响应来确保您已正确设置 cookie。如果它包含 Set-Cookie
header 和新的 connect.sid
那么你做错了。
或者,您可以使用支持本机 cookie 的网络浏览器来防止此类错误。
其次,您可能在两次请求之间重新启动了服务器。
由于您没有为 session 指定任何持久性存储,因此在 node.js 服务器重新启动之间不会保留任何数据。
如果您希望 session 数据在 node.js 服务器停止或重新启动后仍然存在,您应该考虑使用一些持久性 session 存储(即 redis-store
)。