Redis云和connect-redis:客户端已关闭

4

我目前正在使用Express构建网站,希望使用redis云数据库将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
...

我使用了这个指南来设置Redis云并分配dotenv变量(主机,端口和密码)。我已经进行了调试,dotenv正常工作,并且我的主机、端口和密码变量正确。

但问题仍然存在。我仍然在控制台日志中收到The client is closedconnect ECONNREFUSED 127.0.0.1:6379错误提示。我该如何解决这个问题?

6个回答

8

我曾遇到同样的问题并有所收获。现在我使用 '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;

这个可以用。谢谢!我可以问一下为什么要使用 ioredis 模块而不是 redis 吗?这是兼容性问题还是其他原因? - Halsey
ioredis是更新的客户端,而不是redis。我发现关于redis客户端有许多漏洞,因此尝试了ioredis。 - Vishwajeet Mishra

1
try this -->

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

你可以将你的URL设置为'redis://host:port'


1
当您使用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
});

使用host选项时,必须使用旧版本的port选项。


1

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


1
我已经将redisClient.connect()移动到了let redisClient = redis.createClient({...})之后。但是问题仍然存在。 - Halsey
我个人也遇到过这个问题,那就是我的问题所在。我建议您详细阐述一下,并提供日志(如果有的话)。尝试使用cli连接到redis并检查客户端是否已启动。 - frostzt
我已经尝试连接,客户端肯定是开启的。至于错误日志,我已经在我的问题中提供了所有信息。 - Halsey

0
import { createClient } from "redis";

const redisClient = createClient({
    url: "redis://localhost:6379",
});

const start = async () => {
    await redisClient.connect();
};
start();
export default redisClient;

你的回答可以通过添加更多关于代码的信息以及它如何帮助提问者来改进。 - Tyler2P

0

选项1:交换对authconnect的调用顺序

根据Node Redis client documentation

连接到需要身份验证的Redis服务器时,在连接后必须首先发送AUTH命令。

因此,您应该交换对redisClient.authredisClient.connect的调用顺序。

选项2:删除对auth的调用

但是,createClient选项的password属性的文档指出:

如果设置,则客户端将在连接时运行Redis auth命令。

由于您正在向createClient提供password,因此您可以选择仅删除显式调用auth


很遗憾,我已经尝试了两种选项,但错误仍然存在 :( - Halsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接