使用管道函数而不是res.write有什么好处

时间:2019-02-27 07:10:20

标签: node.js http express streaming

框架是Express。

当我从端点发送请求并开始接收数据时,我既可以读取数据块又可以立即将其写入:

responseHandler.on('data', (chunk) => {
  res.write(chunk);
});

或者我可以创建可写流,并通过管道将响应传递给该流。

responseHandler.pipe(res)

很明显,管道功能可以处理前一个过程,并具有更大的尺寸。他们是什么?

1 个答案:

答案 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上附带各种功能(如果可能)。在大多数情况下,这将帮助您避免额外的复杂性,并且与手动管理相比,不会更慢。