node.js - session 更新不会在请求之间持续存在 - nodejs/expressjs/redis/heroku

标签 node.js session heroku express redis

我正在使用 redis 在 expressjs 中存储我的 session 。它在本地运行时工作正常,甚至在部署在 heroku 上时大部分时间也能正常工作。问题是我经常(在 heroku 上部署时)看到我的 session 更新丢失了。

例如用户登录到我的网站,我将他们的用户对象添加到 session 中:

req.session.user = user;

但是(有时)当我稍后(在不同的请求中)尝试检索对象时,它不存在

//sometimes this is empty, even though I've just set it
var currentUser = req.session.user;

我初始化 session 存储如下

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
    })
}));

有什么想法吗?我是否需要对 session 数据进行某种刷新(或显式保存)?

最佳答案

我将劫持这个古老的问题,让大家了解我是如何解决这个问题的。

长话短说

您之前可能已经将 Heroku 应用配置中的 REDIS_URL 值复制到本地 .env 文件中。 Heroku 会随着时间的推移改变该值,而现在这确实发生了。

解决方案是将新的 REDIS_URL 值从 Heroku 应用配置复制到本地 .env 文件或使用另一个 Redis 实例进行本地开发。

您可能已经尝试过的

可能几天前您的 session 还在运行,您尝试并验证了所有常见的可疑问题以解决这个突然出现的问题。

一切都无济于事。最后,当您从 session 配置中删除 RedisStore 位时, session 将再次运行。

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,
        },
    })
);

发生了什么?

一段时间后,我明白了删除 Redis 存储是如何解决问题的。我在我的 Heroku 应用程序配置提供的本地 .env 文件中使用了 REDIS_URL。我了解到 REDIS_URL on the Heroku app may change over time .

In order for Heroku to manage this add-on for you and respond to a variety of operational situations, the REDIS config vars may change at any time. Relying on the config var outside of your Heroku app may result in you having to re-copy the value if it changes.

(强调我的)

所以在我的情况下,这确实发生了,我的本地 .env 文件仍然具有旧的 REDIS_URL 值。实际上,无法创建 session 存储,因为它尝试连接到不存在的服务。这就是为什么删除 RedisStore 并因此回退到默认 MemoryStore 解决了这个问题。

防止再次发生

我在 redislabs.com 创建了一个帐户并创建了一个免费的 Redis 实例。我现在在本地 .env 文件中使用的那个 url。该网址不会改变(我希望)。

关于node.js - session 更新不会在请求之间持续存在 - nodejs/expressjs/redis/heroku,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21290275/

相关文章:

asp.net - 管理 session 状态

ruby-on-rails - 图像在使用 ActiveStorage 的 Rails 应用程序中消失

node.js - WAV 格式的差异 (JS/NodeJS)

node.js - npm 启动失败 : Error: start: `react-scripts start`

javascript - 如何按日期对对象进行分组?

用于网站登录的 PHP session 安全性

node.js - SNS 可以发送加密电子邮件吗?

php - 了解 PHP 中的 session

java - 在 Heroku 中使用 Spring Boot 应用程序发送电子邮件

database - Heroku运行错误