Sails.js会话未在第一次请求时保存

时间:2017-07-29 22:06:22

标签: 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.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)');
  };

问题是第一次请求没有保存会话数据,这意味着我在第一次成功登录后才获得403 forbidden 。因此,我必须先注销然后再次登录才能显示会话数据。

问题是仅限于登录(使用身份验证策略),但也适用于需要包含或不包含策略的会话数据的任何操作。并且每个新会话都会发生 - 不仅是服务器第一次启动。

我认为这个问题是由于使用了内存会话所以我还尝试将Sail.js配置为使用Redis作为会话存储,方法是将config / session.js修改为以下内容:

  adapter: 'redis',

  // host: 'localhost',
  // port: 6379,
  // ttl: 60*60*20,
  // db: 0,
  // prefix: 'sess:',

我取消注释了适配器行并尝试使用和不使用可选的redis连接参数,但是req.session在各处声明未定义

1 个答案:

答案 0 :(得分:0)

我正在使用connect-mongo适配器并发现了类似的问题。原因是,当您使用req.session.user = user时,后台代码将会话保存到数据库(在我的情况下,Mongo,在您的Redis中),之前完成,您的代码将执行{ {1}}部分。

要处理数据库保存的异步代码,请尝试执行以下操作(尚未测试您的代码,但根据我的情况执行此操作,解决了问题):

res.json