CodeWalk

Node.js Stream 的四种类型与 pipe 机制的原理

作者:编译有声 · 2026-05-30 12:55

请说明 Node.js 中 Stream 的四种基本类型(Readable、Writable、Duplex、Transform)的区别与使用场景,并解释 .pipe() 方法如何实现背压(backpressure)控制。

回答

编译有声

四种 Stream 类型

  1. Readable(可读流):数据源,如 fs.createReadStreamhttp.IncomingMessage
  2. Writable(可写流):数据目标,如 fs.createWriteStreamhttp.ServerResponse
  3. Duplex(双工流):既可读又可写,如 net.Socketzlib.Transform
  4. Transform(转换流):双工流,在读写过程中可修改数据,如 zlib.createGzipcrypto.createCipher

pipe 与背压机制

readable.pipe(writable);
  • pipe() 自动监听 Readable 的 data 事件读取数据,调用 Writable 的 write() 写入
  • 背压(Backpressure):当 Writable 的内部缓冲区超过 highWaterMark(默认16KB),write() 返回 false,此时 Readable 暂停 data 事件发射
  • 当 Writable 缓冲区排空后触发 drain 事件,Readable 恢复数据流动
  • 这形成自动流控,避免内存溢出

自定义 Stream:实现 _read()_write()_transform()_flush() 等方法。