首页 > 解决方案 > 使用管道函数比 res.write 有什么优势

问题描述

框架是 Express。

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

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

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

responseHandler.pipe(res)

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

标签: node.jshttpexpressstreaming

解决方案


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

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

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

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

res.write() 函数

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

这意味着可写流可能还没有准备好处理更多数据。因此,您可以按照 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 上的附加功能,如果可能的话,可以管理流。在大多数情况下,它将帮助您避免额外的复杂性,并且与手动管理相比它不会变慢。


推荐阅读