会话更新在请求之间不存在 - nodejs / expressjs / redis / heroku

时间:2014-01-22 17:51:07

标签: node.js session heroku express redis

我正在使用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
    })
}));

有什么想法吗?我是否需要对会话数据进行某种刷新(或明确保存)?

1 个答案:

答案 0 :(得分:0)

我将劫持这个古老的问题,让大家了解我如何通过从会话配置中删除RedisStore实例最终解决该问题。

请注意,几天前我的会议正在进行。当然,我在两者之间进行了更改,但是我看不到它与会话之间的关系。因此,我尝试设置所有常见的嫌疑犯:

全部无济于事。最后,我从会话配置中删除了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可以解决问题。还没尝试过。