Skip to main content

Що робить pipeline() із модуля stream?

Функція pipeline() із модуля stream у Node.js - це зручний і безпечний спосіб з'єднати кілька потоків (Readable, Writable, Transform) в один ланцюжок, із автоматичним керуванням помилками й завершенням.

Проблема, яку вирішує pipeline()

Раніше розробники з'єднували потоки вручну так:

javascript
readable .pipe(transform) .pipe(writable);

Але в такого підходу є недоліки:

  • якщо один потік викине помилку - інші не закриються;
  • потрібно вручну викликати destroy() чи end();
  • складно відстежити, коли весь ланцюжок завершено.

pipeline() вирішує все це.

Синтаксис

javascript
const { pipeline } = require('stream'); pipeline( source, // Readable transform1, // Transform (необов'язковий) transform2, // Transform (необов'язковий) destination, // Writable (err) => { // callback викликається при завершенні чи помилці if (err) { console.error('Помилка в потоці:', err); } else { console.log('Потоки успішно завершено'); } } );

Приклад використання

javascript
const fs = require('fs'); const zlib = require('zlib'); const { pipeline } = require('stream'); pipeline( fs.createReadStream('input.txt'), zlib.createGzip(), fs.createWriteStream('input.txt.gz'), (err) => { if (err) { console.error('Помилка під час стиснення:', err); } else { console.log('Файл успішно стиснено!'); } } );

Тут:

  • fs.createReadStream() - Readable Stream (читає файл),
  • zlib.createGzip() - Transform Stream (стискає дані),
  • fs.createWriteStream() - Writable Stream (записує результат),
  • pipeline() з'єднує їх і керує всім процесом.

Переваги pipeline()

Автоматична обробка помилок Якщо один із потоків викине помилку, усі інші будуть коректно закриті (destroy() викличеться автоматично).

Зручне сповіщення про завершення Фінальний callback викликається, коли всі потоки завершили роботу (чи сталася помилка).

Підтримка асинхронності Починаючи з Node.js 15, pipeline() також доступний у проміс-версії:

javascript
const { pipeline } = require('stream/promises'); await pipeline( fs.createReadStream('input.txt'), zlib.createGzip(), fs.createWriteStream('input.txt.gz') ); console.log('Стиснення завершено!');

Використання з async/await

javascript
import { pipeline } from 'stream/promises'; import fs from 'fs'; import zlib from 'zlib'; async function compress() { try { await pipeline( fs.createReadStream('data.txt'), zlib.createGzip(), fs.createWriteStream('data.txt.gz') ); console.log('Файл стиснено без помилок!'); } catch (err) { console.error('Помилка:', err); } } compress();

Коли використовувати pipeline()

Використовуй pipeline(), коли:

  • у тебе кілька потоків, з'єднаних ланцюжком (Readable → Transform → Writable);
  • ти хочеш надійну обробку помилок;
  • ти працюєш із Promise API (await pipeline()).

Якщо ж у тебе один-два потоки, можна обійтися простим .pipe().

Коротко

Що робитьОпис
З'єднує потокиПрацює як pipe(), але безпечніше
Ловить помилкиАвтоматично знищує всі потоки при помилці
Чекає завершенняCallback / Promise спрацьовує при повному закінченні
Працює з будь-якими типамиReadable, Writable, Transform, Duplex

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.