我绝对对NodeJS流API感到困惑。我正在尝试建立具有相互连接的几个流的管道。看起来像这样:
S3ReadStream -> ParseTransform -> PassThrough -> CustomFilter -> Serializer -> PassThrough
我遇到的问题是错误/完成处理。通常,我尝试使用stream.pipeline()
而不是readable.pipe(writable)
。
例如,当我研究.upload
的S3 nodejs SDK的源代码时,我发现managed_upload.js
以这种方式处理事件:error
导致清理,readable
导致耗尽和end
导致提交。对我来说,这看起来很直观。
https://github.com/aws/aws-sdk-js/blob/v2.391.0/lib/s3/managed_upload.js#L185
问题是,例如,当我使用.pipeline
且error
出现在ParseStream
中时,错误不会传播到其他流(调用错误不会导致错误,导致错误的{ {1}}。
可以看到从未设置close
:
https://github.com/nodejs/node/blob/v10.15.3/lib/internal/streams/end-of-stream.js#L78
虽然在这里可以看到该驱逐舰始终被正确调用 https://github.com/nodejs/node/blob/v10.15.3/lib/internal/streams/pipeline.js#L81
此外,如下面的代码所示,opts.error
似乎并未在最后一个可写流上调用.pipeline
:
end
可能只是我一个人,但是在阅读official docs about之后,它与我所经历的行为或我在代码中看到的行为都不相符。
是否存在一种可靠,简单的方法来如何通过管道传播错误,即每当管道中任何地方发生错误时,所有流都会出错,从而尝试“清除”或“恢复”?也许有一个图书馆可以构建不包含大量隐藏陷阱的“直观”管道,还是我需要通过认真处理所有事件来照顾每一个流?