connect-redis 不存储会话

connect-redis not storing session

我一直在尝试使用 connect-redis 将快速会话存储与 AWS Elasticache 结合使用。 我使用的 AWS 上的 redis 服务器正在使用传输中加密、静态加密和 Redis AUTH 令牌。

我正在使用具有本地策略的 Passport 来验证用户

这是我在 app.js 配置时的样子:

const express = require('express'),
  app = express(),
  session = require('express-session'),
  awsHandler = require('./awsHandler'),
  passport = require('passport'),
 ....
 ....

awsHandler.retrieveServiceCredentials('session').then(keys => {
    let secret = keys.session_key;
    let redis_auth = keys.redis_auth;
    const redis = require('redis');
    const redisClient = redis.createClient({
      host: 'master.redis-connect.abcd.efg.cache.amazonaws.com',
      port: REDIS_PORT,
      auth_pass: redis_auth,
      tls: { checkServerIdentity: () => undefined }
    });
    const redisStore = require('connect-redis')(session);

    app.use(session({
      secret: secret,
      resave: false,
      saveUninitialized: false,
      store: new redisStore({
        client: redisClient
      })
    }));
  });
  ....
  ....
  app.use(passport.initialize());
  app.use(passport.session());

问题是我尝试连接到我的网站,但我没有得到 req.session 或 req.user(在使用带有 connect-sqlite3 包的 SQLite 之前,我有 req.user正在登录)。

当我连接到 Redis 服务器并键入 KEYS * 时,我注意到没有任何密钥存储在 redis 中。但是,当我尝试在 app.js 硬编码的 Redis 服务器中设置密钥时:

redisClient.set('key', 'value')

它正在服务器中设置键和值(键入 KEYS * 时我们可以在那里看到)。 所以我确实成功地与客户端库建立了到 redis 服务器的连接,但是,似乎那里发生了一些我没有正确配置的事情,所以会话被存储在 Redis 中。

我在 AWS 环境(Elastic Beanstalk、Elasticache)上。

感谢您的阅读和帮助!

此致。

我解决了,这是我的代码中的问题: awsHandler.retrieveServiceCredentials 是一个异步函数,并在几秒钟后调用。 在流程中,它已经在初始化应用程序中的所有内容(初始化护照会话、定义路由、启动节点服务器侦听端口等...),并且由于 retrieveServiceCredentials 返回晚于此,所以顺序错误,并且它在我们使用 app.use(prodSessionMiddleware) 之前初始化了应用程序中的所有内容,因此会话不包含在应用程序中。

我们每秒设置一个间隔,如果 'then' 被调用,我们检查一个布尔值,如果被调用,我们清除间隔并继续我们的生活:)