Node.js 数据流读取:深入理解 ‘data‘ 和 ‘end‘ 事件

在 Node.js 中,数据流(Stream)是处理大量数据(如文件上传、网络请求等)的核心机制之一。通过流,我们可以分块处理数据,而不需要一次性将全部数据加载到内存中。本文将深入探讨 Node.js 中 'data''end' 事件的工作原理,以及如何通过 highWaterMark 选项控制数据流的传输行为。


1. 'data''end' 事件

在 Node.js 中,http.IncomingMessage 对象是一个可读流(Readable Stream),它会在接收到请求体数据时触发 'data' 事件,并在数据传输完成后触发 'end' 事件。

'data' 事件
  • 触发时机:每当有新的数据块到达时触发。
  • 参数chunk,表示当前接收到的数据块。
  • 用途:用于逐块处理请求体数据。
'end' 事件
  • 触发时机:当请求体数据传输完成时触发。
  • 用途:用于在数据传输完成后执行清理操作或完成处理逻辑。
示例代码:
const http = require('http');
const fs = require('fs');

const server = http.createServer((req, res) => {
  const fileStream = fs.createWriteStream('output.txt');

  req.on('data', (chunk) => {
    fileStream.write(chunk); // 将数据块写入文件
  });

  req.on('end', () => {
    fileStream.end(); // 结束写入
    res.end('File uploaded successfully');
  });
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});

2. highWaterMark 选项

highWaterMark 是 Node.js 中可读流和可写流的一个重要选项,用于控制内部缓冲区的大小。它直接影响 'data' 事件的触发频率和每次传递的数据块大小。

缓冲区的作用
  • 可读流内部维护一个缓冲区,用于临时存储从数据源读取的数据。
  • 当数据从数据源流入时,首先写入缓冲区。
  • 如果缓冲区已满,数据会等待直到缓冲区中的数据被消费后再写入。
highWaterMark 的影响
  1. 触发频率

    • 较小的 highWaterMark 值会导致 'data' 事件更频繁地触发。
    • 较大的 highWaterMark 值会减少 'data' 事件的触发频率。
  2. 数据块大小

    • 较大的 highWaterMark 值会导致每次触发 'data' 事件时传递的数据块更大。
    • 较小的 highWaterMark 值会导致每次触发 'data' 事件时传递的数据块更小。
示例代码:
const http = require('http');
const server = http.createServer((req, res) => {
  const readableStream = req.pipe(res, { highWaterMark: 1024 }); // 设置 highWaterMark 为 1024 bytes
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});

3. 应用场景与优化

文件上传
  • 使用 'data' 事件逐块接收文件数据,避免一次性加载大文件到内存中。
  • 使用 'end' 事件在文件上传完成后执行清理操作。
网络请求
  • 通过调整 highWaterMark 值,优化数据传输速率和内存使用。
  • 在需要低延迟的场景中,使用较小的 highWaterMark 值;在需要高吞吐量的场景中,使用较大的 highWaterMark 值。
数据流处理
  • 结合 pipe 方法,将可读流直接连接到可写流,实现高效的数据传输。
  • 使用 highWaterMark 控制数据流的缓冲行为,避免内存溢出或性能瓶颈。

总结

事件/选项描述应用场景
'data' 事件在每次数据块到达时触发,用于逐块处理数据文件上传、网络请求、数据流处理
'end' 事件在数据传输完成后触发,用于执行清理操作或完成处理逻辑文件上传完成、请求处理完成
highWaterMark控制缓冲区大小,影响 'data' 事件的触发频率和数据块大小优化数据传输速率和内存使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值