【问题标题】:Redis Cloud and connect-redis: the client is closedRedis Cloud和connect-redis:客户端关闭
【发布时间】:2022-01-20 22:09:21
【问题描述】:

我目前用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 工作正常,主机、端口和密码变量正确。

但问题仍然存在。我仍然收到 客户端已关闭connect ECONNREFUSED 127.0.0.1:6379 错误,如上面的控制台日志中所示。我该如何解决这个问题?

【问题讨论】:

    标签: node.js express redis


    【解决方案1】:

    被困在同一个问题上并找到了一些运气。使用了 '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?是兼容性问题还是其他问题?
    • ioredis 是更新后的客户端,而不是 redis。我发现了很多关于 redis 客户端的错误,因此尝试了 ioredis。
    【解决方案2】:

    使用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选项必须是旧版本。

    【讨论】:

      【解决方案3】:

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

      来自Node Redis client documentation

      连接需要认证的Redis服务器时,AUTH命令必须作为连接后的第一条命令发送。

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

      选项 2:删除对 auth 的调用

      但是,documentation for the password property of createClient options 声明:

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

      当您将password 提供给createClient 时,您也可以删除对auth 的显式调用。

      【讨论】:

      • 遗憾的是,我已经尝试了这两个选项,但错误仍然存​​在:(
      【解决方案4】:

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

      【讨论】:

      • 我在let redisClient = redis.createClient({...}) 之后移动了 redisCLient.connect()。同样的问题仍然存在。
      • 我个人遇到了这个问题,这对我来说是个问题,我建议您详细说明一下,如果有的话,请提供日志。尝试使用cli连接redis并检查客户端是否启动
      • 我已尝试连接,客户端肯定已启动。对于错误日志,我已经在我的问题中提供了它们。
      【解决方案5】:
      try this -->
      
      var options = {
           client: redis.createClient({
           url : process.env.REDIS_URL,
           legacyMode: true,
      })};
      

      您可以将您的网址设为“redis://host:port”

      【讨论】:

        猜你喜欢
        • 2022-08-04
        • 2023-01-30
        • 2014-01-20
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2021-10-31
        相关资源
        最近更新 更多