Node.js使用redis模块无法连接Redis,调用方法报ClientClosedError错误
核心原因
你使用的是v4及以上版本的Node.js Redis官方客户端,该版本存在向下不兼容改动,连接逻辑和旧版不同:
- v3版本调用
redis.createClient()后会自动发起连接,绑定的事件监听器可以正常触发 - v4版本默认不会自动发起连接,必须手动调用
client.connect()方法,未调用时客户端始终处于关闭状态,因此不会触发任何连接相关事件,调用set等操作方法时就会抛出ClientClosedError: The client is closed错误。
修复方案
方案1:适配v4版本逻辑(推荐)
在创建客户端后新增手动调用连接的代码,修复后代码如下:
const redis = require('redis'); const client = redis.createClient(6379); client.on('connect', () => { console.log('connected'); }); client.on('end', () => { console.log('disconnected'); }); client.on('reconnecting', () => { console.log('reconnecting'); }); client.on('error', (err) => { console.log('error', { err }); }); // 新增手动连接调用 client.connect(); setTimeout(() => {console.log("goodbye") }, 20*1000 );
额外注意:v4版本所有Redis操作方法默认返回Promise,需要用async/await或者.then()方式调用,比如await client.set('testKey', 'testValue'),不再支持v3版本的回调传参写法。
方案2:降级到v3版本
如果不想修改现有代码逻辑,可以直接安装v3版本的Redis客户端:
npm install redis@3
安装后原有代码不需要任何改动即可正常运行。
内容的提问来源于stack exchange,提问作者Valchar
相关产品推荐
相关产品推荐

