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' 被调用,我们检查一个布尔值,如果被调用,我们清除间隔并继续我们的生活:)
我一直在尝试使用 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' 被调用,我们检查一个布尔值,如果被调用,我们清除间隔并继续我们的生活:)