我使用了一段与此类似的代码,直到我发现了"setEncoding"方法。在重构代码时,这个问题浮现在我的脑海中。
readable.push(chunk, 'base64')
readable.push(null)
readable.pipe(res)
推送不是一种写入数据的形式吗?我不应该无法将任何数据写入可读流吗?我知道每个数据都需要在某个时候写入(否则它将为空)和读取(或变得无用),但我认为 Node 会从我们这里抽象出来。
有人可以为我澄清这一点吗?谢谢
当您从头开始创建新的可读流时,这会发挥作用。可读流需要从某个地方开始,并且需要有一种将数据放入新流的方法。在执行类似问题中的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
要最全面地了解流在后台的工作方式以及各种类型的流,您应该阅读 子堆栈的流手册.这应该可以回答您可能遇到的任何挥之不去的问题。