Node.js ws 包上的正确错误处理

2024-04-12

我正在努力将基于 REST 的数据管道替换为基于 Websocket 的数据管道,但我无法找到所有可能出错的地方。该系统是生产系统,因此如果出现故障并且无法恢复,将会发生非常糟糕的情况。这是我到目前为止所得到的:

客户端

  • let server = new Websocket(path, opts)
    • 将其包裹在try-catch会发现程序员错误,例如不正确的 URL,但操作错误(例如服务器未正确响应)似乎无法捕获,因为它们是异步的并且没有回调
  • server.send(data, cb)
    • 将其包裹在try-catch将捕获类型错误,通常是程序员错误
    • 在这里添加回调(function (err) { handleErr(err); }) 是一个很好的包罗万象的操作错误,因为回调将有一个非空err如果由于任何原因发送失败,则会进行处理
  • server.on('error', cb)
    • 在这里添加回调似乎是一个好主意,因为error活动是其中的一部分EventEmitter规范,但我实际上还没有发现任何东西
  • Heartbeat Checks (verbose, but described here https://github.com/websockets/ws#how-to-detect-and-close-broken-connections)
    • 这是由ws自述文件作为捕获静默连接失败的一种方法

服务器端

  • server.on('connection', function(connection) {...})
    • Trying connection.send('test', function(err) { handleErr(err); });是在尝试使用它之前确保连接不会以某种方式失败的好方法,但这可能不是必需的。另外,应该将其包裹在try-catch由于上述原因
  • server.on('error', cb)
    • 看起来是个好主意,原因与我在上面在客户端执行的原因相同

看起来就像是建立在ws考虑到生产是很困难的,因为没有地方记录所有可能出错的不同事情,并且使用像 Socket.io 这样对用户更友好的库会消除使用所寻求的许多性能优势ws。是否有关于使用时可能出错的所有不同事情的文档ws,或者至少是一个强化战斗的指南?我觉得部署这个东西只是一场赌博,任何时候我都可能被愤怒地叫到办公室去解决问题。


你应该捕获所有的错误error event.

let server = new Websocket(path, opts)
server.on('error', (error) => {
  //handle error
})

确保在创建连接之后以及对其运行任何操作之前立即调用此方法。否则回调将不会捕获任何错误并且将抛出异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js ws 包上的正确错误处理 的相关文章

随机推荐

  • C:无法在文件上写入数据

    我想打开一个文件 在上面写一些数据 所以我必须使用 Fopen 我不能使用open 因为我在其他一些事情上需要fopen 现在 如果我想使用 fwrite 在文件上写入 我不知道为什么这就是我在代码 option1 中提到的内容 但是如果我
  • sql 查询中的错误“)”附近的语法不正确

    insert into p article client detail current article id sector detail id select article id 2818 from select article id fr
  • Solr Custom RequestHandler - 注入查询参数

    简短的问题 我正在寻找一种方法 java 来拦截对 Solr 的查询并注入我的业务逻辑提供的一些额外的过滤参数 我应该使用什么结构 语境 首先 我要坦白一点 对于 Solr 我是个菜鸟 对我来说 设置一个服务器 定义一个模式 编写一个功能性
  • 如何将 templatefile 函数传递给 Terraform 0.12 中 EC2 资源的 user_data 参数?

    我需要通过以下templatefile功能为user data在 EC2 资源中 谢谢 用户数据 tf templatefile path module init ps1 environment var env hostnames dev
  • 在R中合并多个栅格

    我一直在尝试找到一种省时的方法来在 R 中合并多个光栅图像 这些是来自乞力马扎罗南部地区的相邻 ASTER 场景 我的目标是将它们放在一起以获得一张大图像 这是我到目前为止得到的 对象 ast14dmo 代表 RasterLayer 对象列
  • 使用node.js核心zlib模块压缩成.zip文件

    如何压缩一个或多个文件并将其保存到 zip包含所提供的 node js 的扩展文件zlib https nodejs org api zlib html模块 我想出了如何保存到 gz使用 gzip 如下 const gzip zlib cr
  • 堆叠子图的对齐

    EDIT 我找到了自己的答案 见下文 如何在子图中对齐图像 for ax in axes ax set anchor W EDIT END 我有一些用 imshow 绘制的数据 它在 x 方向上很长 因此我通过在垂直堆叠的子图中绘制数据切片
  • 如何在 IntelliJ IDEA 中自定义 SonarLint 规则?

    是否可以让 SonarLint for IntelliJ IDEA 仅强制执行我在 Sonar 服务器上启用的规则 因为现在可以使用当前版本的 SonarLint 我使用的版本3 0 0 2041 https plugins jetbrai
  • Rust 中的函数是第一类对象吗?

    函数可以作为参数传递吗 例如 在 JavaScript 中 您可以将函数作为参数传递 如下所示 setInterval function 1000 他们是一流的 与 JavaScript 不同 Rust 有两种类型 函数和闭包 fn fir
  • 在 Clojure 中使用 http://foobar.mp3 重定向到 http://fizzbar.mp3

    我正在尝试以编程方式下载 mp3 文件这个 RSS 提要 http podcast menlo church feed 当我打开一个网址时 例如 http menlohurch podbean com mf feed 5gv2gb 1702
  • 如何找到任何活动应用程序的闪烁光标位置?

    我正在为 Mac OS 开发一个应用程序 我想找到当前应用程序的文本光标 插入符号导航 的位置 到目前为止 我已经让它请求可访问权限 并且我也可以监视 keyEvents 但是如何找到闪烁的光标位置 我不是在寻找鼠标光标位置 我想要文本光标
  • 非实例化 C++ 模板函数的语义正确性

    以下 C 代码无法编译 例如使用 g 4 7 或 clang 3 2 struct Bar template
  • 如何在Python中的多个进程之间共享字典而无需锁定

    我需要在多个进程之间共享一个巨大的字典 大小约为 1 GB 但是因为所有进程都将始终从中读取 我不需要锁定 有没有办法在不锁定的情况下共享字典 python中的多处理模块提供了一个Array类 它允许通过设置共享而无需锁定锁 假然而 多处理
  • 什么是铁轨的良好伐木替代品?

    所以 我一直在研究登录我的 Rails 应用程序 我发现 感谢像这样的帖子this https stackoverflow com questions 462651 rails logger format string configurat
  • Laravel Echo - 允许访客连接到状态通道

    我正在使用 laravel echo server 运行 Laravel Echo 来广播事件 我有一个用户计数器频道 显示应用程序上的所有用户 为此 我使用了存在通道 这对于登录用户来说效果很好 但访客永远无法连接 我在 Broadcas
  • Xml序列化顺序问题

    通常 所有这些都非常适合将我的对象序列化为 Xml 字符串 然后再序列化回对象 然而 不同最终用户之间存在这种不一致 我似乎无法追踪 基本上 当我序列化一个对象时 一旦转换为 Xml 它看起来就像这样
  • 安卓。在对话框中调用关闭

    你打电话时dismiss 在对话框上 除了隐藏它之外 它还会将其从内存中删除吗 它是否会删除放置在对话框内的所有对象 例如ImageViews Buttons等等 凭记忆吗 有没有一种方法可以让我自己释放这些对象的内存 而不是等待垃圾收集器
  • 拖动未修饰的 JFrame 并调整其大小

    目前 我正在使用以下代码来拖动和移动未装饰的 JFrame private void initialiseGUI Component component
  • 使用不同的行终止符在Python中读取csv文件

    我有一个 CSV 格式的文件 其中分隔符是 ASCII 单位分隔符 行终止符是 ASCII 记录分隔符 显然 由于这些是非打印字符 我只是使用了此处编写它们的标准方法之一 我已经编写了大量读取和写入 CSV 文件的代码 因此我的问题不在于
  • Node.js ws 包上的正确错误处理

    我正在努力将基于 REST 的数据管道替换为基于 Websocket 的数据管道 但我无法找到所有可能出错的地方 该系统是生产系统 因此如果出现故障并且无法恢复 将会发生非常糟糕的情况 这是我到目前为止所得到的 客户端 let server