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