Node.js pipeline: сжать файл и обработать ошибки потока

Категория: Backend · Язык: JavaScript · Обновлено:

pipeline из node:stream/promises соединяет читаемый поток, преобразователь и поток записи. Он передаёт данные частями, учитывает backpressure и возвращает Promise, который завершается после записи или отклоняется при ошибке.

Сжать файл через поток

JavaScript
import { createReadStream, createWriteStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';
import { createGzip } from 'node:zlib';

await pipeline(
  createReadStream('access.log'),
  createGzip(),
  createWriteStream('access.log.gz', { flags: 'wx' }),
);

Ключ wx не даёт случайно перезаписать существующий access.log.gz: если файл уже есть, операция завершится ошибкой. pipeline закрывает связанные потоки при сбое и отклоняет Promise; обработайте эту ошибку на верхнем уровне приложения. После сбоя частичный файл назначения может остаться, поэтому проверьте его перед удалением или повторной попыткой. API node:stream/promises доступно начиная с Node.js 15.

Пример записывает новый файл рядом с исходным. Проверьте свободное место и не указывайте важный файл как цель без резервной копии.

Официальная документация: Streams Promises API.