Render部署Node.js应用时Redis连接被拒绝问题求助
问题:Render部署Node.js应用时Redis连接被拒绝(ECONNREFUSED 127.0.0.1:6379)
我在Render平台部署一个使用worker和队列处理任务的Node.js应用,尝试连接Redis实例时连接被拒绝,日志显示应用仍在尝试连接本地地址127.0.0.1:6379。
我的配置代码
config/redis.js
const redis = require('redis'); // Redis configuration options const redisConfig = { url: 'redis://red-cjds7cavvtos73bpvvn0:6379', host: 'red-cjds7cavvtos73bpvvn0' }; console.log('redis config started with redis url: ',redisConfig.url) // Create a Redis client const client = redis.createClient(redisConfig); console.log("client added: ",client) // Event listeners for Redis client client.on('connect', () => { console.log('Connected to Redis'); }); client.on('error', (error) => { console.error('Error connecting to Redis:', error); }); console.log('exporting the connection') // Export the Redis client module.exports = client;
根目录index.js导入代码
const express = require('express') const app = express(); const redisConnection=require('./config/redis') const path = require('path') const port = 7000 const db = require('./config/mongoose')
部署日志错误信息
==> Using Node version 14.17.0 (default) Aug 19 04:40:37 AM ==> Docs on specifying a Node version: https://render.com/docs/node-version Aug 19 04:40:37 AM ==> Starting service with 'node index.js' Aug 19 04:40:43 AM redis config started with redis url: redis://red-cjds7cavvtos73bpvvn0:6379 Aug 19 04:40:43 AM client added: Commander { Aug 19 04:40:43 AM _events: [Object: null prototype] {}, Aug 19 04:40:43 AM _eventsCount: 0, Aug 19 04:40:43 AM _maxListeners: undefined, Aug 19 04:40:43 AM commandOptions: [Function: commandOptions], Aug 19 04:40:43 AM select: [AsyncFunction: SELECT], Aug 19 04:40:43 AM subscribe: [Function: SUBSCRIBE], Aug 19 04:40:43 AM unsubscribe: [Function: UNSUBSCRIBE], Aug 19 04:40:43 AM pSubscribe: [Function: PSUBSCRIBE], Aug 19 04:40:43 AM pUnsubscribe: [Function: PUNSUBSCRIBE], Aug 19 04:40:43 AM sSubscribe: [Function: SSUBSCRIBE], Aug 19 04:40:43 AM sUnsubscribe: [Function: SUNSUBSCRIBE], Aug 19 04:40:43 AM quit: [Function: QUIT], Aug 19 04:40:43 AM multi: [Function: MULTI], Aug 19 04:40:43 AM bf: {}, Aug 19 04:40:43 AM cms: {}, Aug 19 04:40:43 AM cf: {}, Aug 19 04:40:43 AM tDigest: {}, Aug 19 04:40:43 AM topK: {}, Aug 19 04:40:43 AM graph: {}, Aug 19 04:40:43 AM json: {}, Aug 19 04:40:43 AM ft: {}, Aug 19 04:40:43 AM ts: {}, Aug 19 04:40:43 AM [Symbol(kCapture)]: false Aug 19 04:40:43 AM } Aug 19 04:40:43 AM exporting the connection Aug 19 04:40:48 AM server is ua and running on port: 7000 Aug 19 04:40:48 AM events.js:353 Aug 19 04:40:48 AM throw er; // Unhandled 'error' event Aug 19 04:40:48 AM ^ Aug 19 04:40:48 AM Aug 19 04:40:48 AM Error: connect ECONNREFUSED 127.0.0.1:6379 Aug 19 04:40:48 AM at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16) Aug 19 04:40:48 AM Emitted 'error' event on Queue instance at: Aug 19 04:40:48 AM at RedisClient.<anonymous> (/opt/render/project/src/node_modules/kue/lib/redis.js:65:13) Aug 19 04:40:48 AM at RedisClient.emit (events.js:376:20) Aug 19 04:40:48 AM at RedisClient.on_error (/opt/render/project/src/node_modules/kue/node_modules/redis/index.js:401:14) Aug 19 04:40:48 AM at Socket.<anonymous> (/opt/render/project/src/node_modules/kue/node_modules/redis/index.js:279:14) Aug 19 04:40:48 AM at Socket.emit (events.js:376:20) Aug 19 04:40:48 AM at emitErrorNT (internal/streams/destroy.js:106:8) Aug 19 04:40:48 AM at emitErrorCloseNT (internal/streams/destroy.js:74:3) Aug 19 04:40:48 AM at processTicksAndRejections (internal/process/task_queues.js:82:21) { Aug 19 04:40:48 AM errno: -111, Aug 19 04:40:48 AM code: 'ECONNREFUSED', Aug 19 04:40:48 AM syscall: 'connect', Aug 19 04:40:48 AM address: '127.0.0.1', Aug 19 04:40:48 AM port: 6379 Aug 19 04:40:48 AM }
我已尝试在连接配置中添加host,但仍无法正常连接,恳请帮助我建立Redis连接。
解决方案
问题根源
从错误日志的调用栈能看到,连接错误来自kue库内部的Redis客户端,而非你自己在redis.js中配置的客户端。kue默认会连接本地Redis服务(127.0.0.1:6379),所以即便你自己配置了正确的Redis实例,只要没给kue指定连接信息,它还是会走默认配置。
修复步骤
找到项目中初始化kue队列的代码,修改为指定Redis连接参数:
const kue = require('kue'); // 用你的Render Redis实例URL配置kue队列 const queue = kue.createQueue({ redis: { url: 'redis://red-cjds7cavvtos73bpvvn0:6379' } });
如果你的Render Redis实例需要密码验证,记得在URL中加入认证信息:
// 示例:带密码的Redis URL格式 const queue = kue.createQueue({ redis: { url: 'redis://<用户名>:<密码>@red-cjds7cavvtos73bpvvn0:6379' } });
额外检查(可选)
如果你使用的是redis库v4.x版本,你的redis.js配置需要手动调用connect()方法完成连接:
// 在redis.js中添加connect调用 const client = redis.createClient(redisConfig); client.connect(); // v4版本需要手动触发连接
验证
重新部署应用后,查看日志如果不再出现127.0.0.1:6379的连接错误,而是显示连接到你的Redis实例地址,说明配置生效。
内容的提问来源于stack exchange,提问作者Himanshu Nain
相关产品推荐
相关产品推荐

