koishijs / koishi

Cross-platform chatbot framework made with love
https://koishi.chat
MIT License
4.53k stars 246 forks source link

Bug: 使用 HTTP 服务 (@koishijs/plugin-http) 的 `ctx.http.ws` 时, 远端拒绝后会导致 Koishi 崩溃自动重载 #1430

Open lovemilk2333 opened 4 months ago

lovemilk2333 commented 4 months ago

Describe the bug

使用 HTTP 服务 (@koishijs/plugin-http) 的 ctx.http.ws 时, 远端拒绝会造成 APP 出现错误 Error: connect ECONNREFUSED 0.0.0.0:443, 即使不在插件的 apply 函数内运行仍会发生, 后 Koishi 崩溃自动重载, 且对该代码行使用 try-catch 无法捕获拒绝连接的异常 (我 await 了也不行).

Steps to reproduce

依赖 HTTP 服务后, 在任意位置执行如下 ts (确保 ctx 为插件的 Context)

ctx.http.ws('wss://0.0.0.0')

Expected behavior

异常可被 try-catch 捕获处理, 即使未被处理也不应使 Koishi 崩溃, 而应使插件报错停止流程

Screenshots

image

Versions

Additional context

No response

shigma commented 4 months ago

此问题由 ws 这个库和 node 底层的实现导致。

目前的解决方案是确保任何创建出的 WebSocket 实例都有 onerror。

当 node 最低版本变为 22 以上版本时,将会替换底层实现以解决此问题。