Redis 2.8.0客户端isReady返回undefined问题咨询
问题分析与解决方案
问题原因
1. 属性名错误:isReady在redis@2.8.0中不存在
node-redis v2.x版本中,判断客户端是否已连接就绪的属性是connected,而非isReady——isReady是v4及以上版本才新增的属性。直接返回this.client.isReady会因属性不存在而得到undefined。
2. 测试代码未等待初始化完成
你在导出redisClient前的自执行异步初始化函数,和测试代码的自执行异步函数是并行执行的。测试代码会在Redis客户端初始化完成前就调用isAlive(),此时要么this.client还未赋值,要么连接未建立,最终返回undefined。
3. waitForReady方法的事件绑定写法错误
你在绑定error和ready事件时,错误地将resolve/reject作为on方法的第三个参数传递。on方法的正确参数格式是事件名, 回调函数,必须在回调函数内部调用resolve或reject,否则Promise永远不会被决议,初始化会一直挂起。
修复步骤
1. 修正waitForReady方法
async waitForReady() { return new Promise((resolve, reject) => { // 错误事件处理:在回调内调用reject this.client.on('error', (err) => { console.log(`Redis: ${err}`); reject(err); }); // 就绪事件处理:在回调内调用resolve this.client.on('ready', () => { console.log('Redis connected'); resolve(); }); // 处理客户端已就绪的边界情况,避免无限等待 if (this.client.connected) { console.log('Redis already connected'); resolve(); } }); }
2. 修改isAlive方法适配v2版本
isAlive() { // 先判断client是否存在,避免空指针错误 return this.client ? this.client.connected : false; }
3. 让测试代码等待初始化完成
在RedisClient模块中暴露初始化Promise,方便外部等待:
const redisClient = new RedisClient(); // 保存初始化Promise const initPromise = (async () => { await redisClient.initialize(); })(); // 添加方法供外部等待初始化完成 redisClient.waitForInit = async () => { await initPromise; }; export default redisClient;
测试代码修改为:
import redisClient from './utils/redis'; (async () => { await redisClient.waitForInit(); // 等待Redis初始化完成 console.log(redisClient.isAlive()); // 此时会返回true })();
内容的提问来源于stack exchange,提问作者Leuel Asfaw
相关产品推荐
相关产品推荐

