Работа с каналами в NodeJS


Ситуация, в которой нам нужно прочитать данные из одного потока и записать их в другой, является достаточно распространенной. Для упрощения такой операции придуманы каналы (англ. pipes).

Давайте посмотрим, как это делается. Пусть у нас есть поток чтения и поток записи:

let readableStream = fs.createReadStream('readme.txt', 'utf8');
let writeableStream = fs.createWriteStream('writeme.txt');
Сделаем так, чтобы поток чтения сразу перенаправлялся в поток записи. Для этого у потоков чтения существует метод pipe:

readableStream.pipe(writeableStream);

Цепочки
Методы pipe можно вызывать цепочкой друг за другом. При этом каждый вызов метода в цепочке позволяет выполнять над данными некоторые операции:

readableStream.pipe(операция).pipe(операция).pipe(операция);
Для примера давайте выполним архивацию файла. Для этого нам надо сначала считать файл, затем сжать данные и в конце записать сжатые данные в файл-архив. В этом нам поможет встроенная в NodeJS библиотека zlib:

import { createGzip } from 'zlib';
Теперь с помощью цепочки методов сначала заархивируем поток чтения, а потом запишем в поток записи:

readableStream.pipe(createGzip()).pipe(writeableStream);