Session 第一次请求时未保存Sails.js会话
我正在使用Sails.js,并试图通过将用户信息保存到会话来进行简单的登录。以下是我的登录操作代码:Session 第一次请求时未保存Sails.js会话,session,redis,sails.js,Session,Redis,Sails.js,我正在使用Sails.js,并试图通过将用户信息保存到会话来进行简单的登录。以下是我的登录操作代码: 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.
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
});
});
这是我对其他页面的策略(登录后):
问题是第一次请求没有保存会话数据,这意味着只有在第一次成功登录后,我才能获得403禁止。因此,我必须注销,然后再次登录才能显示会话数据
该问题不仅限于登录(使用身份验证策略),还适用于任何需要会话数据(使用或不使用策略)的操作。并在每个新会话中发生,而不仅仅是在服务器第一次启动时
我认为问题是由于使用内存会话造成的,因此我还尝试通过将config/session.js修改为以下内容,将Sail.js配置为使用Redis作为会话存储:
adapter: 'redis',
// host: 'localhost',
// port: 6379,
// ttl: 60*60*20,
// db: 0,
// prefix: 'sess:',
我取消了适配器行的注释,并尝试使用和不使用可选的redis连接参数,但随后req.session被声明为处处未定义我正在使用connect mongo适配器,并发现了类似的问题。原因是当您使用
req.session.user=user
时,后台代码正在将会话保存到DB(在我的例子中,Mongo,在您的Redis中),并且在它完成之前,您的代码执行res.json
部分
要处理DB saving的异步代码,请尝试这样做(尚未测试您的代码,但在我的案例中这样做,解决了问题):
我正在使用connect mongo适配器,发现了类似的问题。原因是当您使用
req.session.user=user
时,后台代码正在将会话保存到DB(在我的例子中,Mongo,在您的Redis中),并且在它完成之前,您的代码执行res.json
部分
要处理DB saving的异步代码,请尝试这样做(尚未测试您的代码,但在我的案例中这样做,解决了问题):
不知道发生了什么,我从未经历过这样的问题。但是,为什么不将会话信息放在JWT令牌中呢?正如我所看到的,您正在使用令牌逻辑……我认为这可能是一个解决方法,只需将其放入JWT令牌中,但这有点违背了sails的目的……我的猜测是,您有一个竞赛条件,其中为同一会话设置了两个cookie。可能是前端的加载微调器正在为其图标加载一些webfont,或者是其他一些资产,例如当您单击“提交”登录时动态加载的图像。如果是这样,解决方案是确保在用户提交登录表单之前预加载资产。不确定发生了什么,我从未遇到过这样的问题。但是,为什么不将会话信息放在JWT令牌中呢?正如我所看到的,您正在使用令牌逻辑……我认为这可能是一个解决方法,只需将其放入JWT令牌中,但这有点违背了sails的目的……我的猜测是,您有一个竞赛条件,其中为同一会话设置了两个cookie。可能是前端的加载微调器正在为其图标加载一些webfont,或者是其他一些资产,例如当您单击“提交”登录时动态加载的图像。如果是这样,解决方案是确保在用户提交登录表单之前预加载资产。
adapter: 'redis',
// host: 'localhost',
// port: 6379,
// ttl: 60*60*20,
// db: 0,
// prefix: 'sess:',
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
});
});