在Node.js的ws包中进行适当的错误处理

24
  • 我正在更换基于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规范的一部分,但我还没有实际捕获到任何东西。
    • 心跳检测(冗长,但在这里有描述)
      • 这是ws自述文件推荐的一种捕获静默连接故障的方式。

    服务端

    • server.on('connection', function(connection) {...})
  • 尝试使用connection.send('test', function(err) { handleErr(err); });可以很好地确保在尝试使用连接之前没有出现设置方面的故障,但这可能并非必要。另外,出于以上原因,应该将其包装在try-catch中。
  • server.on('error', cb)
    • 出于与客户端相同的原因,这似乎是一个不错的主意。
  • 似乎在考虑生产时在ws上进行构建是困难的,因为没有文档记录可以出现哪些不同的问题,而选择一个更加用户友好的库(如Socket.io)将消除使用ws所追求的许多性能优势。是否有任何关于使用ws可能出现的所有不同问题的文档,或者至少有一份指南以提高其稳定性?我觉得部署这个东西就像是赌博,随时可能被叫到办公室去修复问题。


    你可以考虑使用像socket.io这样的封装库,它可以提供增强的错误处理功能。对于无法直接向用户提供通信的情况,你可以考虑使用电子邮件和/或短信系统,在问题发生时通知维护人员。 - theGleep
    1
    此外,如果您能使其正常工作,那么在关闭旧机制之前拥有并行代码可能会非常有用。您可以在一段时间内与旧代码同步运行新代码以进行验证。 - theGleep
    1个回答

    6

    您应该在 error 事件中捕获所有的错误。

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

    请确保在创建连接之后并在执行任何操作之前立即调用此方法。否则回调函数将无法捕获任何错误,从而导致异常。


    如何处理 verifyClient 中抛出的 Uncaught Exception - Time Killer

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接