Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить pipeline() із модуля stream?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)`pipeline()` з'єднує кілька потоків (Readable, Transform, Writable) у ланцюжок, як і `.pipe()`, але автоматично закриває всі потоки, якщо один із них падає з помилкою, і викликає callback чи резолвить проміс лише коли вся цепочка завершилася. **Ключове:** з Node.js 15 доступна проміс-версія через `stream/promises`, що дозволяє писати `await pipeline(...)` замість callback-ів.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняФункція `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 |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.