我正在使用 Sails.js 并尝试通过将用户信息保存到 session 来进行简单的登录。这是我的登录操作代码:
AuthService.login(req.body.email, req.body.password).then(user => {
// save user information in the session
req.session.user = user;
req.session.authenticated = true;
return res.json({
user:user,
token:token
});
}).catch(err => {
sails.log.error(err);
res.json(403, {
callstack: err.callstack,
error: 'Authentication error',
reason : err.reason
});
});
这是我对其他页面的政策(登录后):
module.exports = function(req, res, next) {
// User is allowed, proceed to the next policy,
if (req.session.authenticated && req.session.user) {
return next();
}
// User is not allowed
return res.forbidden('You are not permitted to perform this action. (Authenticated)');
};
问题 是第一个请求没有保存 session 数据,这意味着我在第一次成功登录后 仅 收到 403 forbidden。结果,我必须注销然后再次登录才能显示 session 数据。
问题不仅限于登录(使用身份验证策略),还适用于任何需要使用或不使用策略的 session 数据的操作。并且发生在每个新 session 中 - 不仅是服务器第一次启动时。
我认为问题是由于使用内存 session 引起的,所以我还尝试通过将 config/session.js 修改为以下内容来配置 Sail.js 以与 Redis 一起作为 session 存储:
adapter: 'redis',
// host: 'localhost',
// port: 6379,
// ttl: 60*60*20,
// db: 0,
// prefix: 'sess:',
我取消了适配器行的注释,并尝试使用和不使用可选的 redis 连接参数,但是 req.session 在任何地方都被声明为未定义
最佳答案
我在使用 connect-mongo 适配器时发现了类似的问题。原因是因为当你使用 req.session.user = user
时,后台代码将你的 session 保存到数据库(在我的例子中,Mongo,在你的 Redis 中),并且之前 完成后,您的代码将执行 res.json
部分。
为了处理数据库保存的异步代码,尝试做这样的事情(没有测试你的代码,但对我的情况这样做,解决了问题):
AuthService.login(req.body.email, req.body.password).then(user => {
// save user information in the session
// this is on memory
req.session.user = user;
req.session.authenticated = true;
// now the session is saved in DB
req.session.save(function() {
return res.json({
user:user,
token:token
});
}
}).catch(err => {
sails.log.error(err);
res.json(403, {
callstack: err.callstack,
error: 'Authentication error',
reason : err.reason
});
});
关于session - Sails.js session 未在第一次请求时保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394507/