Closed linya72 closed 1 year ago
经过测试,目前可以确认的是:
此问题可能的成因是onebots在有多个 ws_reverse
连接时,会向其中每一条连接发送链接数量的事件,而不是正常的向每一条链接发送一个事件。
问题可能是由于对每个 WSR 连接都注册了事件监听器,导致每次事件发生时,每个连接都会收到事件通知。正确的做法应该是无论有多少个连接,每个事件只分发一次。需要检查是不是在每次调用 startWsReverse
函数时都重复注册了事件监听器,从而导致同一个事件被多次分发。
相关代码段:
问题的根源在于多次执行 this.on("dispatch"
导致的,比如 反向ws
this.config.ws_reverse.forEach((config) => {
this.startWsReverse(config) // 对每个wsr地址创建 WebSocket连接
})
private startWsReverse(url: string) {
this._createWsr(url)
this.on("dispatch", (serialized) => { // on() 函数是个 array, 不是 dict, 因此会创建多个回调
for (const ws of this.wsr) { // 回调内遍历,因此总调用次数变成了 wsr.length * wsr.length
ws.send(serialized, (err) => {
if (err) {
this.logger.error(`反向WS(${ws.url})上报事件失败: ` + err.message)
} else this.logger.debug(`反向WS(${ws.url})上报事件成功: ` + serialized)
})
}
})
}
on为持久监听器,多次调用传入相同的listener,将on改为once即可,创建once监听器接收到事件仅调用一次listener,之后会移除此监听器
今日修复
onebots在设置多个反向ws地址时,会对每个地址建立 设置过的反向地址数量 次的连接