使用管道函数比 res.write 有什么优势

What is the advantage of using pipe function over res.write

框架是 Express。

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

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

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

responseHandler.pipe(res)

很明显,管道函数处理了前一个具有更多维度的过程。它们是什么?

管理事件处理程序和使用 readable.pipe(writable) 之间最重要的区别是使用管道:

The flow of data will be automatically managed so that the destination Writable stream is not overwhelmed by a faster Readable stream. Pipe

这意味着可读流可能比可写流更快,并且管道处理该逻辑。如果您正在编写如下代码:

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

res.write() 函数

Returns: (boolean) false if the stream wishes for the calling code to wait for the 'drain' event to be emitted before continuing to write additional data; otherwise true. Link

这意味着可写流可能还没有准备好处理更多数据。因此,您可以按照 writable.write() 示例中所述手动管理它。

在某些情况下,您没有可读流,您可以使用 writable.write() 写入可写流。 例子

    const data = []; // array of some data.
    data.forEach((d) => writable.write(d));

但同样,您必须看到什么 writable.write returns。如果它为 false,则您必须以手动方式操作以调整流量。

另一种方法是将数据包装到可读流中,然后通过管道传输。

顺便说一下,使用管道还有一个很大的好处。您可以根据需要链接它们,例如:

    readableStream
        .pipe(modify)      // transform stream
        .pipe(zip)         // transform stream
        .pipe(writableStream);

通过汇总所有内容 搭载 node.js 给定的功能,以便在可能的情况下管理流。在大多数情况下,它会帮助您避免额外的复杂性,而且与手动管理相比,不会慢。