You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js WebSocket断开连接后崩溃问题(ultron/index.js:80报错)

解决Node.js WebSocket断开后因ultron库崩溃的问题

这个问题我之前碰到过,根源是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:37:13