【问题标题】:What is the advantage of using pipe function over res.write使用管道函数比 res.write 有什么优势
【发布时间】:2019-07-20 20:19:39
【问题描述】:

框架是 Express。

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

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

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

responseHandler.pipe(res)

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

【问题讨论】:

    标签: node.js http express streaming


    【解决方案1】:

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

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

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

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

    res.write() 函数

    返回:(布尔值)如果流希望调用代码在继续写入其他数据之前等待“drain”事件发出,则为 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 上提供管理流的功能。在大多数情况下,它会帮助您避免额外的复杂性,并且与手动管理相比,它不会变慢。

    【讨论】:

    • 所以,我希望 res.sendres.end 函数能够适当地处理排水问题。
    • 您能告诉我您使用的是什么类型的库吗?这里的“res”是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多