Node.js订阅NATS Streaming Server监听时出现崩溃问题
Kubernetes中Node.js Pod通过NATS Streaming订阅监听器报错排查
报错信息
[be-contact-form] /usr/src/app/node_modules/nats/lib/nats.js:1672 [be-contact-form] callback(err) [be-contact-form] ^ [be-contact-form] TypeError: Cannot read properties of undefined (reading 'emit') [be-contact-form] at /usr/src/app/node_modules/node-nats-streaming/lib/stan.js:884:11 [be-contact-form] at Client.throwOrEmit (/usr/src/app/node_modules/nats/lib/nats.js:1672:5) [be-contact-form] at Client.handledClosedOrDraining (/usr/src/app/node_modules/nats/lib/nats.js:1595:17) [be-contact-form] at Client.subscribe (/usr/src/app/node_modules/nats/lib/nats.js:1727:12) [be-contact-form] at Stan.subscribe (/usr/src/app/node_modules/node-nats-streaming/lib/stan.js:674:29) [be-contact-form] at AuthVerifyListener.Listener.listen (/usr/src/app/node_modules/@paginas/common/build/events/base-listener.js:20:40) [be-contact-form] at /usr/src/app/src/middlewares/current-user.ts:54:6 [be-contact-form] at Generator.next (<anonymous>) [be-contact-form] at /usr/src/app/src/middlewares/current-user.ts:8:71 [be-contact-form] at new Promise (<anonymous>)
排查与解决步骤
确认NATS客户端实例初始化完成
确保调用subscribe前,Stan连接已成功建立。异步初始化时需等待connect的Promise完成,避免连接未就绪就执行订阅:// 正确示例 const stan = await connect('cluster-id', 'client-id', { url: 'nats://nats-service:4222' }); const listener = new AuthVerifyListener(stan); await listener.listen();检查BaseListener类的stan实例有效性
验证BaseListener中的stan属性是否正确赋值,检查listen方法调用stan.subscribe时的this上下文,避免作用域问题导致stan实例丢失。验证Kubernetes中NATS服务的可达性
- 进入Pod执行
nslookup nats-service,确认能解析NATS服务的DNS地址。 - 检查NATS服务默认端口4222是否正确暴露,Pod对应的NetworkPolicy是否允许访问该服务的IP和端口。
- 进入Pod执行
核对NATS客户端版本兼容性
确保node-nats-streaming和nats依赖版本匹配,避免版本不兼容引发内部实例异常。可参考官方文档使用稳定版本组合,同步升级或降级到兼容版本。检查订阅事件处理器的完整性
确认订阅时传入的事件回调函数(如on('message')的处理逻辑)已正确定义,不存在未初始化的情况。
内容的提问来源于stack exchange,提问作者Manel
相关产品推荐
相关产品推荐

