新闻资讯

节点流:先睹为快

言鼎科技 2023-05-21 403

🟠 Node Streams 是为 Node.js 应用程序通道化和处理输入和输出数据的有效方式。

🟠 使用 Node Js 流,企业家可以提高处理大量数据的 Node.js 应用程序的性能、可扩展性和可维护性。

🟠 了解 Node.js 中的流类型及其实用教程,以便更好地理解。

🟠 探索节点流的链接和管道。

什么是 Node Js 中的流?

流是用于处理可按顺序读取或写入的数据的抽象接口。在 Node.js 中,流是用于处理输入和输出源之间数据流的基本概念。

流是 Node.js 中的一个重要概念,因为它们允许高效处理大量数据。流不是一次将所有数据加载到内存中,而是在数据可用时分块处理数据。数据可以从源(如文件或网络套接字)实时流式传输到目标(如响应对象或另一个文件),而无需立即将整个数据缓冲到内存中。

例如,可以从各种数据源、接收器、文件、网络套接字和标准输入/标准输出读取流或写入流。

🟠 流模块

Node.js 中的流模块是一个核心模块,它提供了一种处理流数据的方法。它提供了一组用于创建、读取和写入流的 API。

🟠 节点 Js 流式 API

Node.js 中的 Stream API 是一组 API,提供了一种在 Node.js 中处理流数据的方法。Stream API 提供了一组用于创建、读取和写入 Node 流的类和函数。

以下是 Node.js 中 Stream API 的主要组件:

  • Stream 类: Stream API 提供了几个用于处理 Node js 流的类,包括 Readable、Writable、Duplex 和 Transform 类。这些类提供具有不同功能的不同类型的流。

  • Stream 方法: Stream API 提供了几种处理流的方法,包括用于连接可读和可写类型的 pipe() 方法,以及用于处理数据事件或更多事件的 onData() 方法。

  • 事件: Stream API 提供了几个可以由流发出的事件,包括“数据”、“结束”、“错误”和“完成”。这些事件可用于处理流处理的不同方面。

  • 流选项: Stream API 提供配置流的选项,例如设置可读流的编码或设置可写流的高水位线。

节点流的类型

有四种不同类型的流,每一种都有特定的用途,即可读 NodeJs 流、可写流、双工流和用于 Node js 应用程序的转换流。

让我们了解 Readable Node Js Stream 示例。

🟠 可读流

可读流用于从源读取数据,例如文件或网络套接字。每当新数据可用时,它们都会发出“数据”事件,并在流结束时发出“结束”事件。Node.js 中的可读流示例包括'fs.createReadStream()'用于读取文件和'http.IncomingMessage'用于读取 HTTP 请求。

让我们通过一个例子来理解 Readable Node Js Stream。

节点流:先睹为快
const fs = require('fs');// 从文件创建一个可读流const readStream = fs.createReadStream('example.txt', { encoding: 'utf8' });// 处理流发出的“数据”事件readStream.on('数据', (块) => {
 console.log(`接收到 ${chunk.length} 字节的数据。`);});// 处理流发出的“结束”事件readStream.on('结束', () => {
 console.log('到达文件末尾。');});// 处理流发出的错误readStream.on('错误', (err) => {
 console.error(`错误:${err}`);});

输出

节点流:先睹为快
从块中的文件中读取数据:我的名字是 john doe阅读流结束!

在此示例中,我们使用 fs 模块从名为'例子.txt'. 我们将编码选项设置为'utf8'以字符串形式读取文件。

然后我们处理流发出的“数据”事件,每次从文件中读取一大块数据时都会触发该事件。在这种情况下,我们只记录接收到的字节数。

我们也处理'结尾'流发出的事件,当到达文件末尾时触发。最后,我们将流发出的任何错误记录到控制台。

准备好利用 Node.js Streams 的力量了吗?
立即聘请
Node js 开发人员或与知名 Node.js 开发公司合作,将您的项目提升到一个新的水平!

🟠 可写流

可写流用于将数据写入目标,例如文件或网络套接字。他们有个'写()'方法来写数据和'结尾()'表示流结束的方法。Node.js 中此流的示例包括'fs.createWriteStream()'用于写入文件和'http.ServerResponse'用于编写 HTTP 响应。

NodeJs 可写流示例:

节点流:先睹为快
const fs = require('fs');// 创建一个可写流const writeStream = fs.createWriteStream('output.txt');// 将数据写入文件writeStream.write('Hello from write stream')// 结束可写流writeStream.end();// 处理流事件writeStream.on('完成', () => {
   console.log(`Write Stream Finished!`);})writeStream.on('错误', (错误) => {
   console.error(`Write Stream 错误:${error}`);})

输出

节点流:先睹为快
写流完成!

在此示例中,我们使用 fs 模块为名为的文件创建可写流'输出.txt'。我们将编码选项设置为“utf8”,以字符串形式从文件中读取数据。

然后我们使用 write() 方法将数据写入流,调用它两次以写入两行文本。我们使用 end() 方法结束流。

我们也处理'结束'流发出的事件,在所有数据都写入文件时触发。最后,我们将流发出的任何错误记录到控制台。

🟠双工流

双工流是双向的,这意味着它们可以读取和写入数据。它们可用于将数据从一个网络套接字代理到另一个网络套接字等任务。双工流继承自两者'可读''可写'流,因此它们具有两者的所有方法。

双工流示例:

节点流:先睹为快
const { Duplex } = require('stream');const myDuplex = new Duplex({
 写(块,编码,回调){
   console.log(chunk.toString());
   打回来();
 },
 阅读(大小){
   如果 (this.currentCharCode > 90) {
     这个。推(空);
     返回;
   }
   this.push(String.fromCharCode(this.currentCharCode++));
 }});myDuplex.currentCharCode = 65;process.stdin.pipe(myDuplex).pipe(process.stdout);

在此示例中,我们使用流模块中的 Duplex 类创建一个新的 Duplex 流。每当数据写入流时都会调用 write 方法,并将数据块简单地记录到控制台。每当从流中读取时都会调用 read 方法,在本例中,它将字符从 ASCII 字符集中推送到流中,直到字符代码达到 90,此时它推送 null 以表示流结束。

然后我们通过管道传输标准输入流(过程.stdin)到我们的 Duplex 流,然后将 Duplex 流通过管道传输到标准输出流(过程.stdout)。这允许我们在控制台中键入输入,它被写入双工流,然后双工流的输出被写入控制台。

🟠 转换流

转换流是一种双工流,可以在数据通过它们时修改数据。它们可用于压缩、加密或数据验证任务。转换流继承自'复式',所以他们都有'读()'和一个'写()'方法。当您将数据写入转换流时,它会在作为输出发出之前由转换函数进行转换。

让我们看一个转换 Node.js 流的例子。

节点流:先睹为快
const fs = require('fs');// 导入 strema APIconst { Transform, pipeline } = require('stream');// 创建可读流const readableStream = fs.createReadStream('input.txt');// 创建一个可写流const writableStream = fs.createWriteStream('output.txt');// 设置编码为utf8。readableStream.setEncoding('utf8');// 将 chunk 转换为大写const uppercaseWordProcessing = new Transform({
   转换(块,编码,回调){
       console.log(`要转换的数据:${chunk}`);
       回调(null, chunk.toString().toUpperCase());
   }});可读流
   .pipe(大写文字处理)
   .pipe(可写流)// 或者,我们可以使用管道 API 轻松地通过管道传输一系列流//一起并在管道完全完成时得到通知。管道(readableStream,uppercaseWordProcessing,writableStream,(错误)=> {
   如果(错误){
       console.error(`转换流时发生错误:${error}`);
   } 别的 {
       console.log('流水线成功!');
   }});// 处理流事件readableStream.on('结束', () => {
   console.log(`Read Stream Ended!`);
   writableStream.end();})readableStream.on('error', (error) => {
   console.error(`Read Stream Ended with an error: ${error}`);})writableStream.on('完成', () => {
   console.log(`Write Stream Finished!`);})writableStream.on('错误', (error) => {
   console.error(`Write Stream 错误:${error}`);})

输出

节点流:先睹为快
要转换的数据:我的名字是 john doe阅读流结束!写流完成!流水线成功!

在这个例子中,我们创建了一个名为'大写转换'扩展内置'转换'班级从'溪流'模块。我们重写“_transform”方法,使用'toUpperCase'字符串对象的方法。然后,我们使用'推'方法并调用'打回来'函数来表明我们已经完成了块的处理。

最后,我们通过管道'标准输入'可读流到我们的实例中'大写转换'类,并将生成的转换后的数据传输到'标准输出'可写流 这会导致所有数据写入'标准输入'转换为大写并打印到控制台。

现在我们了解了 Nodejs Streams 的类型,让我们了解使用它们的商业利益。

Node Js Streaming 的优势

使用 Node.js 并拥有大量数据的热门公司(例如 Netflix、NASA、Uber、沃尔玛等)正在利用 Node.js 流,因此能够更好地管理、维持和执行他们的应用程序。以下是在 Node.js 应用程序中使用 Node Streams 的优势。

  • 内存效率: Streams 可以处理大量数据,而无需同时将所有数据都存入内存。这意味着流可以处理太大而无法放入内存的文件和数据。

  • 性能:因为流可以分块处理数据,所以它们比同时读取或写入整个数据集的其他方法更快、更高效。这对于需要低延迟和高吞吐量的实时应用程序特别有用。

  • 灵活性: Streams 可用于处理范围广泛的数据源和目标,包括文件、网络套接字以及 HTTP 请求和响应。这使得流成为在不同上下文中处理数据的多功能工具。

  • 模块化:节点流可以很容易地组合和管道化,允许将复杂的数据处理任务分解成更小、更易于管理的部分。这可以使代码更易于阅读和维护。

  • 背压处理:当数据目的地无法跟上时,Streams 可以通过自动降低数据源的速度来处理背压。这有助于防止缓冲区溢出和其他性能问题。

总体而言,在 Node.js 中使用流有助于提高处理大量数据的应用程序的性能、可扩展性和可维护性。

是时候进一步了解实现 Node 流的潜力和范围,以及 Node Js Streams 的用例了。

节点流中的管道

在 Node Js Streaming 中,管道是一种使用 pipe() 方法将可读流与可写流连接起来的方法。pipe() 方法将可写流作为参数并将其连接到可读流。

当调用 pipe() 时,它会在可读流的“数据”和“结束”事件上设置监听器,并自动将数据从可读流写入可写流,直到到达可读流的末尾。这使得将多个流链接在一起并创建用于处理数据的管道变得容易。

这是使用 pipe() 方法的示例:

节点流:先睹为快
const fs = require('fs');// 从文件创建一个可读流const readStream = fs.createReadStream('input.txt');// 创建文件的可写流const writeStream = fs.createWriteStream('output.txt');// 将可读流通过管道传递给可写流readStream.pipe(writeStream);// 处理任一流发出的错误readStream.on('错误', (err) => {
 console.error(`读取文件时出错:${err}`);});writeStream.on('错误', (err) => {
 console.error(`写入文件时出错:${err}`);});

在这个例子中,我们首先使用 fs 模块创建可读可写类型的流。然后,我们再使用 pipe() 方法将可读流连接到可写流。

我们还使用 on('error') 方法处理任一流发出的任何错误。

请注意,pipe() 是 Node.js 中处理流数据流的一种便捷方式,但它可能并不总是适用于复杂的流处理场景。此外,发现各种调试技术和工具可以帮助您快速识别和修复Debug Node JS 应用程序的问题。

管道节点流的优缺点

好处缺点
高效加工陡峭的学习曲线
便于使用与其他 Node.js 流不兼容
模块化代码调试问题
背压处理复杂的控制流程


让我们开始回答这个问题,什么是节点流链接?

节点 Js 流链接

在 Node Streams 中,链接是一种使用方法链接将多个流操作连接在一起的方法。链接允许您轻松创建可应用于可读流的流操作管道,在数据流经管道时转换或处理数据。

要将流操作链接在一起,您只需在可读流上调用方法,它会返回可以进一步操作或连接到其他节点流的新流对象。当数据流经管道时,将按顺序应用生成的流操作。

下面是使用链接创建流操作管道的示例:

节点流:先睹为快
const fs = require('fs');// 从文件创建一个可读流const readStream = fs.createReadStream('input.txt');// 链式流操作来转换数据读流
 .pipe(transformStream1)
 .pipe(transformStream2)
 .pipe(transformStream3)
 .pipe(writeStream);// 创建文件的可写流const writeStream = fs.createWriteStream('output.txt');// 定义转换流操作const transformStream1 = // ...const transformStream2 = // ...const transformStream3 = // ...

在这个节点流示例中,我们使用 fs 模块从文件创建一个可读流。然后我们结合几个流操作来转换数据,使用 pipe() 方法将每个操作连接到下一个操作。

我们分别定义各个转换流操作,并将它们作为参数传递给 pipe()。这些操作可以是任何流类型,包括 Transform、Duplex,甚至其他可读流。

最后,我们创建一个文件的可写流,并使用 pipe() 将其连接到管道的末端。

请注意,链接是在 Node.js 中处理流数据的一种强大方式,但它有时可能只是最有效或最灵活的方法。此外,了解如何为您的项目利用新版本的 Node.js。按照简单的步骤下载并安装最新版本的 Node 19和更新。

节点链接的优点和缺点

好处缺点
灵活加工复杂的
可重用性陡峭的学习曲线
提高性能兼容性有限
调试方便控制流问题


关键要点

使用 Node.js 流处理数据使 Node 开发人员能够顺畅地处理传入和传出的数据。企业家可以使用流从他们的 Node 应用程序中更好地管理、运行和利用出色的Node js 性能,尤其是通过更好的内存管理。

言鼎科技

The End