Redis Cloud和connect-redis:客户端关闭

Redis Cloud and connect-redis: the client is closed

我目前使用Express搭建网站,想使用redis云数据库在session中保存userID。 redisClient 在 redisClient.js 中创建,之后我将它传递给 app.js 会话中的 redisStore。这是代码:

redisCLient.js

const redis = require("redis");
let redisClient = redis.createClient({
    host: process.env.REDIS_HOSTNAME,
    port: parseInt(process.env.REDIS_PORT),
    password: process.env.REDIS_PASSWORD
});

redisClient.on('error', function(err) {
    console.log('*Redis Client Error: ' + err.message);
});
redisClient.on('connect', function(){
   console.log('Connected to redis instance');
});

(async () => {
    await redisClient.auth(process.env.REDIS_PASSWORD)
        .catch(err => {console.log('Redis auth error: ' + err.message)});
    await redisClient.connect()
        .catch(err => {console.log('Redis connect error: ' + err.message)});
})();

module.exports = redisClient;

app.js

const session = require("express-session");
const redisStore = require('connect-redis')(session);
const redisClient = require('./session-store/redisClient');

...

app.use(cookieParser());
app.use(session({
  store: new redisStore({client: redisClient, ttl: 3600 * 24 * 30}),
  saveUninitialized: false,
  secret: process.env.SESSION_SECRET,
  resave: false
}));

问题是:启动服务器后,我在控制台中收到错误消息,如下所示:

Redis auth error: The client is closed
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
*Redis Client Error: connect ECONNREFUSED 127.0.0.1:6379
...

我用这个 guide 来设置 redis 云并分配 dotenv 变量(主机、端口和密码)。我已经调试并且 dotenv 工作正常并且我的主机、端口和密码变量正确。

但问题依旧。我仍然收到 The client is closed and connect ECONNREFUSED 127.0.0.1:6379 错误,如上面的控制台日志所示。我该如何解决这个问题?

选项 1:将调用顺序切换为 authconnect

来自Node Redis client documentation

When connecting to a Redis server that requires authentication, the AUTH command must be sent as the first command after connecting.

因此,您应该将调用顺序切换为 redisClient.authredisClient.connect

选项 2:删除对 auth

的调用

然而,documentation for the password property of createClient options 指出:

If set, client will run Redis auth command on connect.

当您向 createClient 提供 password 时,您也可以删除对 auth.

的显式调用

您必须在访问客户端之前执行 await redisClient.connect()。尝试在创建后立即移动 redisClient.connect()

被困在同一个问题上并找到了一些运气。使用了 'ioredis' 模块而不是无缝工作的 redis。

const redis = require('ioredis');
const redisClient = redis.createClient({host:'your host address',port:your port,username:'',password:''});

redisClient.on('connect',() => {
    console.log('connected to redis successfully!');
})

redisClient.on('error',(error) => {
    console.log('Redis connection error :', error);
})

module.exports = redisClient;
try this -->

var options = {
     client: redis.createClient({
     url : process.env.REDIS_URL,
     legacyMode: true,
})};

你可以让你的 url 成为 'redis://host:port'

当您使用redis.createClient创建客户端时,您需要使用url而不是hostport.

参考basic-example

它显示 url 格式 redis[s]://[[username][:password]@][host][:port][/db-number]

你的情况可能是这样的

var url = `redis://<YourUsername>:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOSTNAME}:${parseInt(process.env.REDIS_PORT)}`
redis.createClient({
    url: url
});

使用hostport选项必须是旧版本