Node.js WebSocket断开连接后崩溃问题(ultron/index.js:80报错)
这个问题我之前碰到过,根源是ultron库在处理已销毁的事件发射器(EventEmitter)时,没有先检查_events是否存在:当WebSocket断开后,对应的事件发射器实例的_events可能已经被清空或者实例本身被回收,导致执行this.ee._events.hasOwnProperty(event)时抛出错误。
下面是几个可行的解决方案:
1. 升级ultron库到修复版本
这个问题在ultron的1.1.1版本及之后已经被修复,新版本会先检查_events是否存在再调用hasOwnProperty。直接执行升级命令:
npm update ultron --save
如果升级后还是有问题,可以指定安装明确的修复版本:
npm install ultron@1.1.1 --save
2. 主动清理WebSocket断开后的事件监听器
如果暂时无法升级依赖库,可以在你的代码中,当WebSocket触发close事件时,主动移除所有相关的事件监听器,避免后续无效的事件触发调用到已失效的实例:
// 假设你有WebSocket实例ws和delivery实例dl ws.on('close', function() { // 清理delivery的所有事件监听器 dl.removeAllListeners(); // 清理WebSocket自身的所有监听器 ws.removeAllListeners(); });
这样可以防止断开后还有事件试图调用已被销毁的事件发射器,从根源上避免触发ultron的错误代码。
3. 升级delivery模块
因为你的代码中用到了delivery模块,而它内部依赖ultron,旧版本的delivery可能绑定了有问题的ultron版本。直接升级delivery也能间接解决问题:
npm update delivery --save
补充说明
报错的核心逻辑是ultron旧版本的代码没有做防御性检查:
ultron/index.js:80 if (this.ee._events.hasOwnProperty(event))
当this.ee._events为undefined时,调用hasOwnProperty就会抛出TypeError。新版本的ultron会先判断this.ee._events是否存在,再执行后续逻辑。
内容的提问来源于stack exchange,提问作者Nikola Lukic

