【问题标题】:Express session using redis store couldn't create session使用 redis 存储的快速会话无法创建会话
【发布时间】:2016-10-21 02:50:14
【问题描述】:

我使用 Express 4.13.1 和 Redis 作为会话存储。

app.use(session({
    store: new RedisStore,
    secret: '...',
    resave: false,
    saveUninitialized: true
}));

一开始可以,但后来就不行了(升级 node.js 之后)。使用默认存储(内存)可以正常工作,但使用 RedisStore,不会创建会话。这是创建会话的代码:

router.post('/admin/login', (req, res, next) => {
    Auth.compare(..., () => {
        req.session.authorized = true;
        req.session.userId = id;

        console.log(req.session);    // It prints well. Session is created

        res.redirect('/admin/main');
    });
});

在那一刻,会话发生了变化:

Session {
  cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  authorized: true,
  userId: '...'}

但在那之后,没有创建会话:

router.get('/admin/main', (req, res, next) => {
    console.log(req.session);
    ...
});

打印会话:

Session {
  cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true }
}

我手动使用了 session.save,但是没有用。我错过了什么?

【问题讨论】:

  • @FurkanO 感谢您修正我的话。

标签: node.js session express redis


【解决方案1】:

在使用 redis 时,可能会检查应用程序中的几个点来解决此类问题。首先,检查您的浏览器是否获取了 cookie,例如通过检查资源 -> cookie 在浏览器上

  • 检查到期日期并在此处查看会话 ID。

其次,从redis-cli检查redis是否有对应的key,如果key存在,key是否过期:

  • 所有键:keys *

  • 键值:get key (sess:PMlu4s1PYHnSZXBMSoJGLgjNSGXq_s-g is a key for me)

  • 检查您的密钥何时过期:ttl key

可能存在以下问题之一:

  • 您可能对 redis 配置不当
  • 你可能不恰当地配置了redis ttl,例如 你的 ttl 值应该以秒为单位,而 cookie maxAge 在 毫秒。

我建议您不要询问您的 server.js 代码,而是按照以下步骤检查是否一切正常,过期或至少创建了会话。

【讨论】:

  • 我在浏览器上检查了 cookie,它创建得很好。并且 Expires/Max-Age 值是“会话”
  • 我猜问题是你的 redis 配置。您可以尝试从 redis-cli 检查 redis 中是否有相同的 sessionid。
  • 我刚刚检查了redis,获取所有键返回(空列表或集合)。我安装后没有配置redis。为什么会这样?
  • 另外我问我的问题是connect-redis github问题,有人尝试了我的代码并且成功了。在更新 node.js 之前我也工作过。 :(
  • 创建一个小型服务器并再次尝试功能。 Npm 从头开始​​安装一切。
猜你喜欢
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 2022-01-26
  • 2015-07-05
  • 1970-01-01
  • 2021-05-22
  • 2012-08-30
相关资源
最近更新 更多