Docker Redis 错误:连接 ECONNREFUSED 127.0.0.1:6379

发布于 2025-01-11 19:57:37 字数 4164 浏览 3 评论 0原文

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

当我发送 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 Node.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 命令:docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

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

I'm following a tutorial from youtube creating a simple dockerized CRUD application in Express, Node.js, Mongo & Redis. I stucked at video 3:06:57 on Authentication with sessions & Redis.

The initial issue I faced below when I send a 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...

I found out that the issue above was due to Redis version, the tutorial video was using Redis 3.0+ if not mistaken , but I'm having Redis 6.0+ .So I added the line redisClient.connect().catch(console.error); but second issue happen.

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
}

the source files as below:

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 
}

I did a check to the redis container logs and it's up and running. Also it should be in the same network with the node-app.

docker command : docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

Full source code from tutor https://github.com/Sanjeev-Thiyagarajan/node-docker

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

德意的啸 2025-01-18 19:57:37

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

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

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

Redis client doesn't work in v4 of Redis. Replace the redisClient code with this:

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

redisClient.connect().catch(console.error)
梦断已成空 2025-01-18 19:57:37

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

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

I've tried this code and it solves the problem at 100%.

let redisClient = redis.createClient({
  legacyMode: true,
  socket: {
    port: REDIS_PORT,
    host: REDIS_URL
  }
});
    
redisClient.connect().catch(console.error)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文