node.js - 使用管道函数比 res.write 有什么优势
问题描述
框架是 Express。
当我从端点发送请求并开始接收数据时,我可以分块读取数据并立即写入:
responseHandler.on('data', (chunk) => {
res.write(chunk);
});
或者我可以创建一个可写流并将响应传递给它。
responseHandler.pipe(res)
很明显,管道函数处理了前一个过程,它具有更多的维度。这些是什么?
解决方案
管理事件处理程序和使用 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 上的附加功能,如果可能的话,可以管理流。在大多数情况下,它将帮助您避免额外的复杂性,并且与手动管理相比它不会变慢。
推荐阅读
- reactjs - 如何向此 const 添加控制台日志?(使用反应和打字稿)
- python - 根据某些标准,熊猫中两行之间的百分比变化
- python - torch.return_types.max 作为张量
- c# - TagLib-Sharp 不编辑评论属性
- laravel - 为什么单击单选按钮时 Laravel Dusk 测试不会触发 x-on:change() 或 x-model
- animation - 理论上你是如何沿着一条路径实现动画的?
- c# - 从身份服务器 url 读取参数
- java - JAVA API 调用 将响应与上一个响应进行比较
- flutter - “字符串”类型不是“描述”类型的子类型
- react-native - 获取父节点句柄 - 类似于 findNodeHandle