gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:58:38 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com