Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 第一次请求时未保存Sails.js会话_Session_Redis_Sails.js - Fatal编程技术网

Session 第一次请求时未保存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.

我正在使用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
  });
});
这是我对其他页面的策略(登录后):

问题是第一次请求没有保存会话数据,这意味着只有在第一次成功登录后,我才能获得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
  });
});