【问题标题】:Docker Redis Error: connect ECONNREFUSED 127.0.0.1:6379Docker Redis 错误:连接 ECONNREFUSED 127.0.0.1:6379
【发布时间】:2022-08-21 17:51:26
【问题描述】:

我正在关注 youtube 上的教程,在 Express、Node.js、Mongo 和 Redis 中创建一个简单的 dockerized CRUD 应用程序。我停留在视频 3:06:57 上使用会话和 Redis 进行身份验证。

我在下面发送 POST 时遇到的最初问题

ClientClosedError: The client is closed
    at Commander._RedisClient_sendCommand (/app/node_modules/@node-redis/client/dist/lib/client/index.js:408:31)
    at Commander.commandsExecutor (/app/node_modules/@node-redis/client/dist/lib/client/index.js:166:154)
    at Commander.BaseClass.<computed> [as set] (/app/node_modules/@node-redis/client/dist/lib/commander.js:8:29)
    at RedisStore.set (/app/node_modules/connect-redis/lib/connect-redis.js:65:21)
    at Session.save (/app/node_modules/express-session/session/session.js:72:25)
    at Session.save (/app/node_modules/express-session/index.js:406:15)
    at ServerResponse.end (/app/node_modules/express-session/index.js:335:21)
    at ServerResponse.send (/app/node_modules/express/lib/response.js:221:10)
    at ServerResponse.json (/app/node_modules/express/lib/response.js:267:15)
    at exports.login (/app/controllers/authController.js:45:28)
[nodemon] app crashed - waiting for file changes before starting...

我发现上面的问题是由于 Redis 版本引起的,如果没有弄错,教程视频使用的是 Redis 3.0+,但我使用的是 Redis 6.0+。所以我添加了 redisClient.connect().catch(console.error); 行,但发生了第二个问题。

Error: connect ECONNREFUSED 127.0.0.1:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1138:16) {
  errno: -111,
  code: \'ECONNREFUSED\',
  syscall: \'connect\',
  address: \'127.0.0.1\',
  port: 6379
}

源文件如下:

index.js:

const express = require(\"express\");
const mongoose = require(\"mongoose\");
const session = require(\"express-session\");
const redis = require(\"redis\");
let RedisStore = require(\"connect-redis\")(session);

const { MONGO_PASSWORD, MONGO_IP, MONGO_PORT, MONGO_USER, REDIS_URL, REDIS_PORT, SESSION_SECRET } = require(\"./config/config\");


let redisClient = redis.createClient({
    host: REDIS_URL,
    port: REDIS_PORT,
})

// let redisClient = createClient({ 
//     host: REDIS_URL,
//     port: REDIS_PORT 
// });
 
//redisClient.connect().catch(console.error);

redisClient.on(\'error\', err => {console.log(\'Error \' + err);});

docker-compose.yml:

version : \"3\"
services :
  node-app:
    build : .
    ports:
      - \"3000:3000\"
    environment:
      - PORT=3000
    depends_on:
      - mongo

  mongo:
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password
    volumes:
      - mongo-db:/data/db

  redis:
    image: redis
    
volumes:
  mongo-db:

docker-compose.dev.yml:

version : \"3\"
services :
  node-app:
    build:
      context: .
      args:
        NODE_ENV: development
    volumes:
      - ./:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
      - MONGO_USER=admin
      - MONGO_PASSWORD=password
      - SESSION_SECRET=secret
      
    command: npm run dev
  mongo:
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password

config.js:

module.exports = {
    MONGO_IP: process.env.MONGO_IP || \"mongo\",
    MONGO_PORT: process.env.MONGO_PORT || 27017,
    MONGO_USER: process.env.MONGO_USER,
    MONGO_PASSWORD: process.env.MONGO_PASSWORD,
    REDIS_URL: process.env.REDIS_URL || \"redis\",
    REDIS_PORT: process.env.REDIS_PORT || 6379,
    SESSION_SECRET: process.env.SESSION_SECRET 
}

我检查了 redis 容器日志,它已启动并正在运行。它也应该与节点应用程序在同一个网络中。

码头工人命令:docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

完整源码来自导师https://github.com/Sanjeev-Thiyagarajan/node-docker

  • 请使用redisClient.on(\'error\', err =&gt; {console.log(\'Error \' + err);}); 连接到redis 并让我知道结果。
  • 127.0.0.1 表示您的应用认为 Redis 的 URL 是localhost。它必须是redis
  • 您的问题似乎包含链接六个图像文件,但没有实际的源代码。您能否edit 将问题本身(不是链接后面)中的相关源代码和错误消息作为纯文本(不是图像)包含在内?
  • 嗨@xirehat,我替换了提到的行,结果回到我最初的错误:/app/node_modules/@node-redis/client/dist/lib/client/index.js:408 return Promise.reject(new errors_1 .ClientClosedError()); ^ ClientClosedError:客户端已关闭..
  • 嗨@HansKilian,我确实在本地主机环境中运行该应用程序。它们是 dockerized 并且应该在同一个网络中。

标签: node.js docker express redis econnrefused


【解决方案1】:

Redis 客户端在 Redis v4 中不起作用。将 redisClient 代码替换为:

let redisClient = redis.createClient({
    legacyMode: true,
    socket: {
        port: REDIS_PORT,
        host: REDIS_URL
    }
})

redisClient.connect().catch(console.error)

【讨论】:

  • 就我而言,我没有在“套接字”键中添加端口和主机
【解决方案2】:

我已经尝试过这段代码,它以 100% 的速度解决了问题。

let redisClient = redis.createClient({
  legacyMode: true,
  socket: {
    port: REDIS_PORT,
    host: REDIS_URL
  }
});
    
redisClient.connect().catch(console.error)

【讨论】:

  • 通过添加有关代码的作用以及它如何帮助 OP 的更多信息,可以改进您的答案。
猜你喜欢
  • 1970-01-01
  • 2017-07-06
  • 2017-05-16
  • 2020-08-27
  • 2023-03-18
  • 2021-03-14
  • 2020-12-25
  • 2019-01-03
  • 2022-11-22
相关资源
最近更新 更多