如何在Node.js中进行JavaScript对象的管道/流处理
本文简要介绍了在Node.js中实现管道/流处理的方法,以及缓冲区、流的工作原理以及在Node.js中如何实现管道。
缓冲区: 它们是用于在数据从一个地方传输到另一个地方时的临时存储空间,缓冲区被填充了数据然后传递出去。缓冲区以小块数据的方式传输。缓冲区非常有用,因为我们不必等待完全的传输过程,我们填满了缓冲区,这是数据的临时存储空间,然后可以一起传递。
流: 它们是用于数据传输的数据处理方法。通过在数据完全传输之前对数据进行处理,可以提高性能。它们将小块缓冲区收集在一起,当缓冲区填满后,将数据传递到流中进行处理并发送给客户端。它们是数据处理的方法,用于按照正确的顺序读取或写入输入到输出。缓冲区和流一起播放在线视频时,不需要等待完整的视频处理,而是通过缓冲区和流逐位逐位地传输小节。
可读流: 可读流用于从任何来源提取信息,它们被用于读取存在于任何来源上的数据,然后我们可以使用该数据传输到任何来源或存储到我们的系统中。可读流以 chunks (来自缓冲区的)的形式发出事件,这是需要处理的数据的一小部分。
示例: 在当前项目目录中创建一个名为 read.txt 的文件,其中包含一些示例文本,本例中我们有以下文本。
THIS IS READ.TXT FILE
文件名: index.js
// Requiring file system module
const fs = require('fs');
// Creating a read stream
const myReadStream = fs.createReadStream('read.txt', 'utf8');
myReadStream.on('data', function (chunk) {
console.log("new chunk received");
// Printing the chunk
console.log(chunk);
});
输出:
new chunk received
THIS IS READ.TXT FILE
可写流: 可写流允许您将数据发送到任何目标源,可以是任何文件或在线流源。这些流还会定期发出事件以确保正常运作。
示例: 创建一个名为 index.js 的文件,并使用以下代码。
文件名:index.js
// Requiring file system module
const fs = require('fs');
// Creating a write stream
// It will create a txt file in provided location
const myWriteStream =
fs.createWriteStream(__dirname + '/write.txt');
// Writing on stream
myWriteStream.write("Greetings from GeeksforGeeks");
输出: 在当前目录中会生成一个名为 write.txt 的新文件,其中包含以下数据。
Greetings from GeeksforGeeks
使用pipeline()进行管道传输:
管道传输是一种直接从一个流传输数据到另一个流的方法,通过使用缓冲区来实现,这样一旦填满缓冲区,数据传输过程就可以开始。换句话说,管道传输用于在多个步骤中处理流式数据。这是一个模块方法,用于在流之间进行管道传输,向前传递错误并在管道完成时清理并提供回调函数。
示例: 在当前项目目录中创建一个read.txt文件,并填写一些示例文本,例如下面的文本。
THIS IS READ.TXT FILE
文件名:index.js
const fs = require('fs');
const zlib = require('zlib');
const { pipeline } = require('stream');
// Constructing promisify
const { promisify } = require('util');
const pipelineAsync = promisify(pipeline);
// Creating a read stream
const myReadStream = fs.createReadStream(
__dirname + '/read.txt', 'utf8');
// Creating a write stream
const myWriteStream = fs.createWriteStream(
__dirname + '/write.txt');
// Creating transform stream
const transform = zlib.createGzip();
(async function run() {
try {
// Pipelining three streams
await pipelineAsync(
// Reading from read stream
myReadStream,
// Transforming the file
transform,
// Writing on write stream
myWriteStream
);
console.log("Pipeline accomplished");
}
catch (err) {
console.error('pipeline failed with error:', err);
}
})();
输出: 我们将看到以下输出,并且在当前目录中将生成write.txt文件。
Pipeline accomplished
注意: 管道应该使用管道而不是管道,因为管道是不安全的,但下面给出了管道的实现方式:
文件名:index.js
// Requiring file system module
const fs = require('fs');
// Creating a read stream
const myReadStream = fs.createReadStream(
__dirname + '/read.txt', 'utf8');
// Creating a write stream
const myWriteStream = fs.createWriteStream(
__dirname + '/write.txt');
// Piping using pipe
myReadStream.pipe(myWriteStream);
console.log("Piping accomplished");
输出: 我们将看到以下输出,并且当前目录中将生成write.txt文件。
Piping accomplished