Redis创建的客户端总是连接到127.0.0.1,即使我特别更改了Redis主机的ip



我在尝试将应用程序容器连接到redis容器时遇到问题。

不断得到相同的错误->错误:连接ECONNREFUSED 127.0.0.1:6379

但只有当我在docker容器中运行这两个容器时,才会发生这种情况。如果我尝试在容器中只运行redis,并且我的应用程序在本地运行,那么一切似乎都很好。

以下是我的.js代码的一部分,它连接到redis:

const express = require('express');
const router = express.Router();
const userService = require('../service/userService')
const constants = require('../helpers/constants')
const redis = require('redis');
const client = redis.createClient(6379, 'redis');
client.connect();

var checkCache = async (req, res, next) => {

const data = await client.get('get-users');
if(!data){
next();
}else{
client.disconnect();
return res.status(200).json(JSON.parse(data));
}
};

router.get('/users', checkCache, async function (req, res) {
const users = await userService.getUser();
client.set('get-users', JSON.stringify(users));
client.expire('get-users', 60);
client.disconnect();
return res.status(200).json(users)
});

我的码头组合yml:

version: '3.2'
services:
redis:
container_name: "redis"
image: redis:latest
ports:
- "6379:6379"
networks:
node_net:
ipv4_address: 172.28.1.4
volumes:
- $PWD/redis.conf:/usr/local/etc/redis/redis.conf
command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
market:
tty: true
container_name: "market_place"
build:
context: ./
dockerfile: ./docker/Dockerfile
volumes:
- .:/usr/src/app
networks:
node_net:
ipv4_address: 172.28.1.5
ports:
- "${MF_PORT:-4000}:4000"
depends_on:
- redis
links:
- redis
networks:
node_net:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16

我在构建和启动容器后得到的错误如下:

Listening in port 4000
market_place | node:internal/process/promises:246
market_place |           triggerUncaughtException(err, true /* fromPromise */);
market_place |           ^
market_place | 
market_place | Error: connect ECONNREFUSED 127.0.0.1:6379
market_place |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16)
market_place | Emitted 'error' event on Commander instance at:
market_place |     at RedisSocket.<anonymous> (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/index.js:332:14)
market_place |     at RedisSocket.emit (node:events:390:28)
market_place |     at RedisSocket._RedisSocket_retryConnection (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/socket.js:146:14)
market_place |     at processTicksAndRejections (node:internal/process/task_queues:96:5)
market_place |     at async RedisSocket._RedisSocket_connect (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/socket.js:113:55)
market_place |     at async Commander.connect (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/index.js:156:9) {
market_place |   errno: -111,
market_place |   code: 'ECONNREFUSED',
market_place |   syscall: 'connect',
market_place |   address: '127.0.0.1',
market_place |   port: 6379
market_place | }
market_place | npm notice 
market_place | npm notice New minor version of npm available! 8.1.2 -> 8.3.0
market_place | npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.3.0
market_place | npm notice Run npm install -g npm@8.3.0 to update!
market_place | npm notice 

有人能解释一下为什么它试图连接到127.0.0.1,尽管我的容器ip是172.28.1.4吗?

如果我删除docker compose上的网络配置并在本地运行我的代码,我就可以连接并保存redis数据库中的所有内容。

我已经检查了这里发布的其他一些问题,但没有一个问题能解决我的问题。

谢谢!

您的代码在创建客户端时不提供Redis容器的IP。试试这个:

// const client = redis.createClient(6379, 'redis');
const client = redis.createClient({
socket: {
port: 6379,
host: '172.28.1.4',
}
});

有关详细信息,请查看createClient配置。

它也可以使用

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

最新更新