为什么我可以推送到可读流?

edu*_*gbg 7 stream node.js

在我发现“setEncoding”方法之前,我一直在使用一段与此类似的代码。在重构代码的时候,这个问题来了。

readable.push(chunk, 'base64')
readable.push(null)
readable.pipe(res)
Run Code Online (Sandbox Code Playgroud)

推送不是一种写数据的形式吗?我不应该无法将任何数据写入可读流吗?我知道每个数据都需要在某个时候写入(否则它将为空)和读取(或变得无用),但我认为 Node 会从我们这里抽象出来。

有人可以帮我解决这个问题吗?谢谢

pet*_*teb 9

当您从头开始创建新的可读流时,这一点就会发挥作用。可读流需要从某个地方开始,并且需要有一种方法将数据放入该新流中。在您的问题中执行push()类似操作时,您会缓冲数据,直到读取数据为止,然后从流中将其刷新,然后通过管道/读入目标以供使用。消费者将继续读取数据,直到命中“null”,这表明流已完成输出数据。

var stream = require('stream');
var readable = new stream.Readable(); // new empty stream.Readable
readable.push('some data');
readable.push(null); // Done writing data
Run Code Online (Sandbox Code Playgroud)

要最全面地了解流在底层如何工作以及各种类型的流,您应该阅读Substack 的流手册。这应该可以回答您可能存在的任何挥之不去的问题。