Node.js 中的 Stream.duplex

2025年3月1日 | 阅读 3 分钟

Node.js 以其非同步和事件处理结构而闻名,这有助于开发高度高效的应用程序。在教学层级中,Stream 模块是构建该架构的基础组成部分之一。流是处理流数据的抽象接口,它们有多种类型:Readable、Writable、DuplexTransform。在本文中,我们将讨论 Node.js 中的 stream.duplex 类,该类包含了 Readable 和 Writable 流的工作原理。

什么是 stream.duplex?

stream.duplex 是 Node.js 中的一个类。它是一个实现可读和可写流接口的模块。这意味着 Duplex 流既可以用于读取流,也可以用于写入流,数据可以从流中读取,也可以写入流。这种双重特性使得双工流在需要双向通信的场景中特别有用,例如在网络协议、加密/解密和数据压缩中。

stream.duplex 如何工作?

stream.duplex 有两个独立的内部缓冲区。一个用于可读端,一个用于可写端。这些缓冲区异步工作,因此,可以同时向给定的 Duplex 流写入数据并读取该流。但是,需要注意的是,这些类型不总是按读取和写入的顺序存储,而是分开控制的。

创建 Duplex 流

为了创建自定义双工流,我们需要扩展 stream.duplex 类并实现 _read()_write() 方法。

输出

Stream.duplex in Node.js

说明

在上面的示例中,MyDuplex 类扩展了 stream.duplex_write() 方法将传入的数据推入一个内部数组,而 _read() 方法则从数组中移出数据并将其作为可读块推出去。当发出 data 事件时,它会将数据记录到控制台。

主要方法

  • write(chunk[, encoding][, callback])
    此方法将数据写入流的可写端。
  • end([chunk][, encoding][, callback])
    此方法表示将不再向可写端写入数据。
  • read([size])
    此方法从内部缓冲区拉取数据并发出 data 事件。
  • setEncoding(encoding)
    此方法设置要作为字符串读取的数据的编码。
  • pipe(destination[, options])
    此方法将流的可读端管道连接到可写目标。

用例

stream.duplex 的一些用例如下:

  • 网络协议
    全双工流在底层协议(如 TCP)中特别有效,因为数据是双向传输的。
  • 加密/解密
    其用途之一是可以应用于加密/解密算法,这些算法包含读取、处理和写入功能。
  • 数据压缩
    如果此实用工具要执行的最重要操作是数据压缩和终端数据解压缩,则双工流可用于压缩实用工具。

最佳实践

此功能的几项最佳实践如下:

  • 错误处理: 在读取或写入时出现问题时,可以收听 error 事件。
  • 流量控制: 建议谨慎处理背压和流量控制机制,尤其是在处理大量数据流时。
  • 资源管理: 还需要检查是否已进行适当的资源清理,特别是在不再需要流时。

结论

Node.js 中的 stream.duplex 类是处理输入和输出数据传输的最有效方法之一。主要是在利用实现自定义数据处理机制的机会的各种应用程序中非常有用。