Node.js - 如何处理流错误事件

Posted

技术标签:

【中文标题】Node.js - 如何处理流错误事件【英文标题】:Node.js - How to handle stream error events 【发布时间】:2013-12-02 10:10:32 【问题描述】:

我正在从 fs.createReadStream() 返回的文件流中读取数据,并将其传送到使用 zlib.createGzip() 创建的 gzip 流,然后将 gzip 流传送到 HTTP 响应。

我不确定如何处理这些流上的“错误”事件。我只是想确保所有流都已关闭,记录了错误,并且没有资源泄漏(请注意,文件流的 autoClose 设置为 true)。

例如,如果 fs 读取流发生错误,这将如何影响 gzip 流以及响应流? 'error' 事件会自动传播,还是会未经处理而导致我的应用程序崩溃?我应该在每个流上侦听“错误”事件还是只在链中的最后一个流上侦听?如果我在 fs 流上收听“错误”会发生什么 - gzip 流是否仍会检测到发生了错误?

【问题讨论】:

【参考方案1】:

从一个流到另一个流的错误不会在管道上传播,因此您应该将错误侦听器附加到两个流。

如果 fs 读取流有错误,如果 autoClose 为 true 则将其销毁(它会清理并关闭文件描述符)。但是 gzip 流不会被关闭,所以你必须手动关闭它。

如果 gzip 有错误,它只会发出它。它不会被关闭,可读流也不会。

查看其他流,比如fs write stream,如果写入发生错误,那么它会关闭可写流,但可读流会保持打开状态。

所以我的建议是,在所有流上设置错误处理程序,不要依赖自己关闭错误,所以在所有错误上调用 .close.destroy

要确保您正在侦听所有错误处理程序,请使用 domains。

【讨论】:

以上是关于Node.js - 如何处理流错误事件的主要内容,如果未能解决你的问题,请参考以下文章

一般来说,Node.js 如何处理 10,000 个并发请求?

Node.js 的设计错误

我使用vscode写node.js代码,出现如下问题,请问如何处理?

我无法弄清楚如何防止在 Node.js 中出现此 CORS 错误 [重复]

对 Node.js 事件驱动模型的深入理解

Node.js如何处理健壮性