代码之家  ›  专栏  ›  技术社区  ›  Harshal Patil

HTTP响应流是否需要Node.js中的错误事件处理程序?

  •  2
  • Harshal Patil  · 技术社区  · 7 年前

    我尝试了很多实验,但都没有得到HTTP OutgoingMessage 发射 error 永远的事件。但我知道 基本上是一个 WritableStream 因此很容易 错误 .

    还有,当我读到这个官员的时候, Node.js docs about Anatomy of an HTTP transaction ,建议处理响应流上的错误。

    如果是,会导致什么情况 错误 事件会发生吗?我应该默默地接受这些错误吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   sripberger    7 年前

    这周我一直在想同样的事情,但我似乎找不到任何直接的答案。

    我仔细检查了一遍 Koa 看看他们做了什么,看起来他们根本没有向res流附加错误处理程序。

    任何可能导致流错误的原因都必须是罕见的,或者不会像节点教程所建议的那样使程序崩溃。如果是这样,膝关节炎就无法使用了,因为很多人使用它,情况似乎不太好。

    我查看了其他HTTP框架,如Hapi和Express,但它们的代码库非常复杂,我发现很难得出类似的结论\

    我还发现 this 几年前的一组实验似乎表明Node的教程与Node的实际行为不太一致:

    虽然这个实验可能不是对网络编程中可能出错的所有事情的详尽观察,但这里的结果似乎表明HTTP响应流永远不会发出错误事件;或者,至少,这样的错误事件永远不会使服务器崩溃。因此,尽管您必须将“错误”事件处理程序绑定到Node.js中几乎每一个其他流,但您似乎可以安全地假设HTTP响应流永远不会出错,无论发生什么情况。而且,即使响应流关闭,您也可以继续向其写入/通过管道向其写入,而不会产生任何后果。

    对于我自己的项目,我只是将错误记录在某个地方,以防万一。

        2
  •  0
  •   Nedko Dimitrov    7 年前

    错误优先回调

    让我们想象一下您不处理错误的情况:

    fs.readFile('./non_existing_file.json', (err, data) => {
    
      // here we don't handle the error
      // and if there is an error
      // the second parameter will be undefined
    
      let myDataObj = JSON.parse(data)
      ...more code...
    
    })
    

    现在我们没有处理错误,在尝试解析时 未定义 我们得到一个错误,使我们的应用程序崩溃。我们需要手动启动我们的应用程序。

    通过处理错误:

    fs.readFile('./some_file.json', (err, data) => {
    
      if(err) throw err
      // if there is an error
      // the rest of the function won't be executed
    
      let myDataObj = JSON.parse(data)
      ...more code...
    
    })
    

    没有必要记录错误,我们只是记录它以帮助调试。当然,你可以安全地吞下它更换 if(err) throw err if(err) return

    这取决于您决定如何处理错误,还是完全处理错误。将它们记录下来是件好事,最好是通知用户出了问题。

    推荐文章