我正在使用redis在expressjs中存储我的会话。它在本地运行时工作正常,甚至在heroku上部署时也可以工作。问题是经常(在heroku上部署时)我看到我的会话更新丢失了。
e.g。用户登录我的网站,然后将他们的用户对象添加到会话中:
req.session.user = user;
然而(有时)当我尝试稍后检索对象时(在不同的请求中)它不存在
//sometimes this is empty, even though I've just set it
var currentUser = req.session.user;
我按如下方式初始化会话存储
if (process.env.REDISTOGO_URL) {
console.log('Connecting to redis:' + process.env.REDISTOGO_URL);
var rtg = require('url').parse(process.env.REDISTOGO_URL);
var redis = require('redis').createClient(rtg.port, rtg.hostname);
redis.auth(rtg.auth.split(':')[1]);
} else {
console.log('Connecting to local redis');
var redis = require('redis').createClient();
}
//sessions
app.use(express.cookieParser('secret key for cookie monster')); //used by session
var RedisStore = require('connect-redis')(express);
app.use(express.session({
store: new RedisStore({
client: redis
})
}));
有什么想法吗?我是否需要对会话数据进行某种刷新(或明确保存)?
答案 0 :(得分:0)
我将劫持这个古老的问题,让大家了解我如何通过从会话配置中删除RedisStore实例最终解决该问题。
请注意,几天前我的会议正在进行。当然,我在两者之间进行了更改,但是我看不到它与会话之间的关系。因此,我尝试设置所有常见的嫌疑犯:
cookie: { secure: false }
'trust proxy'
credentials: 'include'
+ Access-Control-Allow-Credentials
header set to true 全部无济于事。最后,我从会话配置中删除了RedisStore位:
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
// ...
server.set('trust proxy', 1);
server.use(
session({
// store: new RedisStore({
// url: process.env.REDIS_URL,
// }),
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: true,
cookie: {
path: '/',
httpOnly: true,
secure: false,
maxAge: null,
},
})
);
多田。会议再次开始。我不知道为什么,但是我怀疑connect-redis
依赖项不再与express-session
用法兼容。
更新:后来我发现setting saveUninitialized
to false
可以解决问题。还没尝试过。