使用管道函数相对于 res.write 有什么优势

Cha*_*lie 5 streaming http node.js express

该框架是Express。

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

responseHandler.on('data', (chunk) => {
  res.write(chunk);
});
Run Code Online (Sandbox Code Playgroud)

或者我可以创建一个可写流并将响应传输到该流。

responseHandler.pipe(res)
Run Code Online (Sandbox Code Playgroud)

显然,管道函数以更多维度处理了前一个过程。这些是什么?

小智 4

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

数据流将被自动管理,以便目标可写流不会被更快的可读流淹没。管道

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

    responseHandler.on('data', (chunk) => {
        res.write(chunk);
    });
Run Code Online (Sandbox Code Playgroud)

res.write() 函数

返回:(布尔值)如果流希望调用代码在继续写入附加数据之前等待发出“drain”事件,则返回 false;否则为真。关联

这意味着可写流可能尚未准备好处理更多数据。因此,您可以按照 writable.write() 示例中提到的方式手动管理它。

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

    const data = []; // array of some data.
    data.forEach((d) => writable.write(d));
Run Code Online (Sandbox Code Playgroud)

但同样,您必须查看 writable.write 返回的内容。如果为假,您必须以手动方式调整水流流量。

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

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

    readableStream
        .pipe(modify)      // transform stream
        .pipe(zip)         // transform stream
        .pipe(writableStream);
Run Code Online (Sandbox Code Playgroud)

通过总结所有内容,如果可能的话,在 Node.js 上提供管理流的功能。在大多数情况下,它将帮助您避免额外的复杂性,并且与手动管理相比不会慢。