Конвейер в NodeJS — это процесс, с помощью которого байтовые данные из одного потока отправляются в другой поток.
Что такое потоки?
Потокив NodeJS — это последовательность байтов. Когда программа обрабатывает некоторые данные, ей необходимо прочитать все данные в память, а затем обработать их и записать данные обратно в какое-то место. Однако этот подход не работает, когда необходимо обработать большое количество данных. Чтобы преодолеть эту проблему, для обработки данных используются алгоритмы потоковой передачи, в которых данные не считываются все сразу, а «втекают» в программу, обрабатываются и «вытекают» из программы. Здесь данные обрабатываются небольшими порциями, и целые данные никогда не хранятся в памяти сразу. Поток данных можно сравнить с примером воды, текущей в реке, где большое количество воды транспортируется, протекая через реку с течением времени. Потоковые алгоритмы более эффективны с точки зрения использования памяти и быстрее. Вы можете прочитать эту статью, чтобы получить подробное руководство попотоки.
Что такое трубопровод?
Конвейерная обработка в NodeJS полезна, когда нам нужно записать некоторые данные, поступающие из исходного потока, в другой поток. В таком случае мы можем использовать конвейерные алгоритмы, предоставляемые NodeJS, вместо того, чтобы писать собственную логику чтения и записи. В основном мы передаем поток чтения и поток записи друг другу. Это можно сравнить с соединением двух водоемов с помощью трубы для передачи воды.
Давайте возьмем пример с конвейером, предположим, вы хотите написать сервер, который обслуживает некоторые файлы. В этом случае вам нужно будет написать код для обработки операции чтения файлов и код для записи данных в сетевой сокет. Но с помощью конвейера, предоставляемого NodeJS, вы можете легко подключить файловый поток к потоку сетевого сокета для отправки данных. В NodeJS есть функция pipe() для обработки этой операции, которая предоставляется с объектом потока и принимает объект потока.
Функцию конвейера можно использовать для соединения входного потока с выходным потоком или включить в комбинацию потоков для создания сложного конвейера для выполнения определенной задачи.
Убедитесь, что на вашем компьютере установлен NodeJS. Если нет, скачайте его отсюда, а затем установите. Все модули, используемые в этом проекте, по умолчанию включены в NodeJS.
Подход 1: подключение потока чтения к потоку записи с использованием pipe()
Структура проекта: Структура нашего проекта будет следующей:
- index.js:основной, содержащий код.
- input.txt:файл, из которого считываются данные
- output.txt:файл, в который записываются данные
В этом подходе необходимы следующие модули:
- fs:модуль файлового потока, используемый для создания файловых потоков и взаимодействия с ними.
Шаг 1: Создайте файл с именем input.txt и вставьте в него следующий текст. Создайте имя файла output.txt и оставьте его пустым.
GeeksForGeeks — это круто.
Шаг 2: Создайте файл index.js. и вставьте в него следующий код.
Javascript
const fs = require(
"fs"
);
const fs = require(
"fs"
);
let rs = fs.createReadStream(
"./input.txt"
);
let ws = fs.createWriteStream(
"./output.txt"
);
function
callback(msg) {
console.log(msg);
}
// pipeReadToWrite() accepts two streams a
// readStream and s writeStream and a callback function.
function
pipeReadToWrite(readStream, writeStream, callback) {
// handles any error occured in the stream
function
handleError(err) {
// close the streams and call callback
readStream.close();
writeStream.close();
callback(err);
}
readStream
.on(
"error"
, handleError)
.pipe(writeStream)
.on(
"error"
, handleError)
.on(
"finish"
, callback);
}
pipeReadToWrite(rs, ws, callback);
let rs = fs.createReadStream(
"./input.txt"
);
let ws = fs.createWriteStream(
"./output.txt"
);
function
callback(msg) {
console.log(msg);
}
// pipeReadToWrite() accepts two streams a
// readStream and s writeStream and a callback function.
function
pipeReadToWrite(readStream, writeStream, callback) {
// handles any error occured in the stream
function
handleError(err) {
// close the streams and call callback
readStream.close();
writeStream.close();
callback(err);
}
readStream
.on(
"error"
, handleError)
.pipe(writeStream)
.on(
"error"
, handleError)
.on(
"finish"
, callback);
}
pipeReadToWrite(rs,ws,callback);
Объяснение кода:
- Включите модуль fs (файловый поток), который используется для создания файловых потоков и взаимодействия с ними. Создайте поток чтения и подключите его к input.txt и поток записи и подключите его к output.txt
- Функция pipeReadToWrite() принимает поток чтения и поток записи.
- HandleError() — это функция обратного вызова, которая обрабатывает любую ошибку, возникающую при чтении или записи потока.
- Выполнить функцию pipeReadToWrite() с необходимыми аргументами.
Шаг 3: Запустите файл index.js, написав команду в командной строке.
node index.js
Вывод: откройте output.txt, и вы увидите в нем следующий вывод.
GeeksForGeeks — это круто.
Подход 2: подключение более двух потоков для создания сложного рабочего процесса.
Структура проекта: Структура нашего проекта будет следующей:
- index.js:основной, содержащий код.
- input.txt:файл, из которого нужно сжать.
В этом примере мы подключаем несколько потоков для сжатия файла.
В этом подходе необходимы следующие модули.
- fs:модуль файлового потока, используемый для создания файловых потоков и взаимодействия с ними.
- zlib:предоставляет различные методы сжатия файлов.
Шаг 1: Создайте файл с именем input.txt и вставьте в него следующий текст. Создайте имя файла output.txt и оставьте его пустым.
GeeksForGeeks — это круто.
Шаг 2: Создайте файл index.js. и вставьте в него следующий код.
Javascript
const fs = require(
"fs"
);
const zlib = require(
"zlib"
);
// gzip() function accepts a filename
// to be compressed and a callback function
function
gzip(filename, callback) {
// Create the streams
let source = fs.createReadStream(filename);
let destination = fs.createWriteStream(filename +
".gz"
);
let gzipper = zlib.createGzip();
// Set up the pipeline
source
.on(
"error"
, callback)
.pipe(gzipper)
.pipe(destination)
.on(
"error"
, callback)
.on(
"finish"
, callback);
}
gzip(
"./input.txt"
, (msg) => {
console.log(msg);
});
Объяснение кода:
- Включите все необходимые модули
- Функция gzip() принимает путь к файлу и функцию обратного вызова. Он сжимает файл, указанный в пути, и выполняет функцию обратного вызова после успешного сжатия файла.
- Выполните функцию gzip().
Шаг 3: Запустите файл index.js. Перейдите в командную строку и выполните команду, указанную ниже:
node index.js
Вывод: вы увидите, что создается новый файл с именем input.txt.gz. Это сжатая версия input.txt.
файл input.txt.gz создан