首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker Redis错误: connect 127.0.0.1:6379

Docker Redis错误: connect 127.0.0.1:6379
EN

Stack Overflow用户
提问于 2022-03-05 08:50:29
回答 2查看 3.2K关注 0票数 1

我正在跟随youtube的一个教程,在Express,Node.js,Mongo & Redis中创建一个简单的坞化CRUD应用程序。我在视频3:06:57关于与会话的认证& Redis。

我发邮件时所面临的第一个问题

代码语言:javascript
运行
复制
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+ .So我添加了行redisClient.connect().catch(console.error);,但是第二个问题发生了。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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 
}

我检查了红色容器日志,它已经启动并运行了。此外,它应该在同一个网络的节点-应用程序。

docker命令:docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

家教https://github.com/Sanjeev-Thiyagarajan/node-docker提供的完整源代码

EN

回答 2

Stack Overflow用户

发布于 2022-05-06 03:11:15

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

代码语言:javascript
运行
复制
let redisClient = redis.createClient({
    legacyMode: true,
    socket: {
        port: REDIS_PORT,
        host: REDIS_URL
    }
})

redisClient.connect().catch(console.error)
票数 6
EN

Stack Overflow用户

发布于 2022-08-17 12:59:09

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

代码语言:javascript
运行
复制
let redisClient = redis.createClient({
  legacyMode: true,
  socket: {
    port: REDIS_PORT,
    host: REDIS_URL
  }
});
    
redisClient.connect().catch(console.error)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71360779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档