pipe道node.js对象stream到多个目的地正在产生奇怪的结果 – 为什么?

当将一个变换streampipe道转换为另外两个变换stream时,偶尔会从一个目标stream中获取一些对象,而不是在另一个目标stream中正确的对象。 在90,000个对象的stream中,在大约三分之一的运行中,大约从序号10,000开始的约10个对象来自错误的stream(不规则对象的数目的起始位置变化)。 世界上能够解释如此奇怪的结果是什么?

设置:

sourceStream.pipe(processingStream1).pipe(check1); processingStream1.pipe(check2).pipe(destinationStream1); processingStream1.pipe(processingStream2).pipe(destinationStream2); 

sourceStream是由文件读取提供的变换stream。 两个目标stream是导致文件写入的转换stream。 文件读取和文件写入均通过fs streaming API。 所有的stream都依赖于pipe道中的node.js自动背压。

如上所述,偶尔来自processingStream2的对象正在泄漏到destinationStream1中。

检查stream(check1 a sink,check2 a passthrough)通过check2显示stream中存在的exception对象,而不是stream中check1中的exception对象。

文件读取和写入是文本(csv)文件。 我在Windows 7上使用的Node.js版本8.6(虽然当之无愧,请不要在后者扔石头)。

关于如何更好地隔离问题的build议也受到欢迎。 这个variables的结构足够好,它看起来不像是一个普通的内存泄漏,但是不足以成为一个代码错误。 我很迷惑。

啊! processingStream2修改通过它的stream中的对象(实际上修改了子对象的属性)。 显然你不能依靠pipe道的顺序来控制stream对象变化的顺序。 很偶然的是,在通过processingStream2发送源对象之后,input对象processingStream2通过节点内部进入processingStream1。 可能作为一些优化的一部分。

获得的教训:即使您认为您正在向下游进行更改,也不要在pipe道到多个目的地时更改inputstream对象。 愿你永远不用学习这个难得的教训!