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

标签 node.js stream gzip fs

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

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

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

最佳答案

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

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

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

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

所以我的建议是,在所有流上设置错误处理程序并且不要依赖它们自己在错误时关闭,因此对所有流调用 .close.destroy错误。

为确保您正在监听所有错误处理程序,请使用 domains .

关于Node.js - 如何处理流错误事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20061691/

相关文章:

optimization - jQuery 作为 AMD 模块并使用 r.js 进行优化

javascript - 谷歌地图地理编码结果未定义

python - 如何使用音频指纹测量流之间的延迟

python - 在 python 中读取/压缩一个大文件的更简洁的方法

python - 如何将 .tar 转换为 .tgz

编译 Visual Studio 解决方案命令行

node.js - 在自托管 VSO 代理上运行 NPM

python - PyAudio - 将stream.read转换为int以获得幅度

.net - 如何从内存中的图像获取流?

google-app-engine - 如何在 Google App Engine 上获取 gzip 或 brotli 编码