Що робить pipeline() із модуля stream?
Функція pipeline() із модуля stream у Node.js - це зручний і безпечний спосіб з'єднати кілька потоків (Readable, Writable, Transform) в один ланцюжок, із автоматичним керуванням помилками й завершенням.
Проблема, яку вирішує pipeline()
Раніше розробники з'єднували потоки вручну так:
readable
.pipe(transform)
.pipe(writable);Але в такого підходу є недоліки:
- якщо один потік викине помилку - інші не закриються;
- потрібно вручну викликати
destroy()чиend(); - складно відстежити, коли весь ланцюжок завершено.
pipeline() вирішує все це.
Синтаксис
const { pipeline } = require('stream');
pipeline(
source, // Readable
transform1, // Transform (необов'язковий)
transform2, // Transform (необов'язковий)
destination, // Writable
(err) => { // callback викликається при завершенні чи помилці
if (err) {
console.error('Помилка в потоці:', err);
} else {
console.log('Потоки успішно завершено');
}
}
);Приклад використання
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() також доступний у проміс-версії:
const { pipeline } = require('stream/promises');
await pipeline(
fs.createReadStream('input.txt'),
zlib.createGzip(),
fs.createWriteStream('input.txt.gz')
);
console.log('Стиснення завершено!');Використання з async/await
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 |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.