我正在从fs.createReadStream()返回的文件流中读取,并且我将它传递给使用zlib.createGzip()创建的gzip流,然后我将gzip流传递给HTTP响应。 / p>
我不确定如何处理这些流上的'错误'事件。我只想确保所有流都关闭,记录错误,并且没有资源泄露(注意文件流的autoClose设置为true)。
例如,如果fs读取流发生错误,那将如何影响gzip流,然后影响响应流? “错误”事件会自动传播还是只是未处理并使我的应用程序崩溃?我应该在每个流上或仅在链中的最后一个流上监听“错误”事件吗?如果我在fs流上听'错误'会发生什么 - gzip流是否仍会检测到发生了错误?
答案 0 :(得分:6)
从一个流到另一个流的错误不会在管道上传播,因此您应该将错误侦听器附加到两个流。
如果fs读取流有错误,如果autoClose为true则会被销毁(它将清理并关闭文件描述符)。但是gzip流不会被关闭,所以你必须手动关闭它。
如果gzip有错误,它只会发出它。它不会被关闭,也不会是可读的流。
查看其他流,如fs write stream,如果写入时发生错误,则会关闭可写流,但可读流将保持打开状态。
所以我的建议是,在所有流上设置错误处理程序,不要依赖自己关闭错误,因此请对所有错误调用.close
或.destroy
。
要确保您正在侦听所有错误处理程序,请使用domains。