框架是Express。
当我从端点发送请求并开始接收数据时,我既可以读取数据块又可以立即将其写入:
responseHandler.on('data', (chunk) => {
res.write(chunk);
});
或者我可以创建可写流,并通过管道将响应传递给该流。
responseHandler.pipe(res)
很明显,管道功能可以处理前一个过程,并具有更大的尺寸。他们是什么?
答案 0 :(得分:1)
管理事件处理程序和使用可读.pipe(可写)之间最重要的区别是使用管道:
将自动管理数据流,以使目标可写流不会被更快的可读流淹没。 Pipe
这意味着可读流可能比可写流更快,并且通过管道处理该逻辑。如果您正在编写如下代码:
responseHandler.on('data', (chunk) => {
res.write(chunk);
});
res.write()函数
返回:(布尔值)如果流希望调用代码在继续写入其他数据之前等待发出“ drain”事件,则为false;否则为false。否则为真。 Link
这意味着可写流可能尚未准备好处理更多数据。因此,您可以按照writable.write()示例中的说明手动进行管理。
在某些情况下,您没有可读流,并且可以使用writable.write()写入可写流。 例子
const data = []; // array of some data.
data.forEach((d) => writable.write(d));
但是,再次,您必须看到writable.write返回的内容。如果为假,则必须以手动方式调整流量。
另一种方法是将数据包装到可读流中,然后通过管道传输。
顺便说一句,使用管道还有另一个很大的优势。您可以根据需要将它们链接起来,例如:
readableStream
.pipe(modify) // transform stream
.pipe(zip) // transform stream
.pipe(writableStream);
通过汇总所有内容,可以在node.js上附带各种功能(如果可能)。在大多数情况下,这将帮助您避免额外的复杂性,并且与手动管理相比,不会更慢。