Redis Pub/Sub报错:listener is not a function 问题求助
Redis Pub/Sub 订阅者报错 "listener is not a function" 的排查与解决
错误原因
核心问题是事件绑定顺序错误:你先调用subscriber.connect()完成连接,之后才绑定message事件监听器。在@redis/client库中,订阅者客户端连接后会立即和Redis服务器建立Pub/Sub通道,此时如果还未绑定message监听器,内部处理消息的逻辑会尝试调用未定义的listener,从而抛出TypeError: listener is not a function。
补充说明:Redis的Pub/Sub机制要求订阅者客户端是专用的,不能同时执行普通读写命令,所以确实需要单独通过duplicate()创建订阅者;发布者可以复用主客户端,但单独创建也能避免订阅者的阻塞逻辑影响发布操作,你的配置思路是正确的。
解决方法
调整订阅者的代码顺序,先绑定事件监听器,再执行连接和订阅操作,同时优化客户端初始化的代码可读性:
// 初始化主客户端 const client = redis.createClient(); client.on('error', err => console.log('Redis Client Error', err)); const redisClient = await client.connect(); // 初始化发布者 const publisher = client.duplicate(); publisher.on('error', err => console.log('Redis Publisher Error', err)); await publisher.connect(); // 初始化订阅者:先绑定事件,再连接、订阅 const subscriber = client.duplicate(); subscriber.on('error', err => console.log('Redis Subscriber Error', err)); // 先绑定message事件,确保监听器已就绪 subscriber.on('message', (channel, message) => { console.log(`Received message on channel ${channel}: ${message}`); }); // 再执行连接和订阅操作 await subscriber.connect(); await subscriber.subscribe('abc123'); // 发布消息 publisher.publish('abc123','lala');
关键注意点
- 订阅者的事件监听器(如
message、subscribe)必须在connect()和subscribe()之前注册,否则会出现监听器未就绪的错误。 - 给发布者、订阅者单独绑定
error事件,能更精准地排查各自客户端的问题,避免主客户端的错误日志混淆。 - 调用
subscribe时使用await,可以确保订阅操作完成后再发布消息,降低消息丢失的概率。
内容的提问来源于stack exchange,提问作者arisalexis
相关产品推荐
相关产品推荐

