session - Sails.js session 未在第一次请求时保存

标签 session redis sails.js

我正在使用 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/

相关文章:

database - 雷迪斯 : How to back up redis data from remote to local?

node.js - 通过(sails js)水线将值推送到mongodb数据库数组中

c# - 流利;用于创建 session 的 SessionSource 或 SessionFactory?

python - 为什么 Sqlalchemy Session.close 不记录 "rollback"?

php - 来自 2 个表的 MySql session

node.js - sails.js(使用 node.js 和 express.js)的标题或应用名称在哪里?

node.js - Sails.js - 当我 exec() 时数据对象变为空白

无法从新页面访问 Java session 变量

redis - 如何解决redis cluster "Waiting for the cluster to join"问题?

php - 在 Debian 服务器上安装 php 7.4 的 redis 扩展