多年来,Node.js 开发人员创建了许多包,其目的是让使用流变得更容易。
什么是 Node.js Stream?
Node.js 应用程序由单个进程运行,无需为每个请求创建新线程。 Node 在其标准库中提供了一组异步 I/O 原语,可以防止 JavaScript 代码阻塞,通常,Node.js 中的库是使用非阻塞范例编写的,使阻塞行为成为异常而不是正常行为。
流是数据的集合——就像数组或字符串一样。 不同之处在于流可能不会一次全部可用,也就是说,它们不必一次行加载到内存中。 这使得流在处理大量数据
或一次来自外部源的数据时非常强大。
然而,流不仅仅是处理大数据。 它们还赋予了我们代码中可组合性的力量。 就像我们可以通过管道传递其他较小的 Linux 命令来组成强大的 linux 命令一样,我们可以在 Node 中使用流执行完全相同的操作。
Node 中的许多内置模块都实现了流接口,下面是一些例子:
上面的列表有一些原生 Node.js 对象的示例,这些对象也是可读和可写的流。 其中一些对象既是可读流又是可写流,例如 TCP 套接字、zlib 和加密流。
请注意,这些对象彼此之间也密切相关。 虽然 HTTP 响应是客户端上的可读流,但它是服务器上的可写流。 这是因为在 HTTP 案例中,我们基本上从一个对象 (http.IncomingMessage) 读取并写入另一个对象 (http.ServerResponse)。
另外请注意,当涉及到子进程时,stdio 流(stdin、stdout、stderr)是如何维护逆流类型(inverse Stream Type)的。 这允许开发人员采取一种非常简单的方法,从主进程 stdio 流与这些流进行管道传输。