PassFront
  1. PassFront
  2. База знаний
  3. Потоки и буферы

Что такое Stream в Node.js и зачем он нужен?

Потоки и буферы

Stream — абстракция для обработки данных по частям, без загрузки всего объёма в память.

Четыре вида потоков

  • Readable — источник данных: fs.createReadStream, HTTP-запрос на сервере.
  • Writable — приёмник: fs.createWriteStream, HTTP-ответ.
  • Duplex — читает и пишет: TCP-сокет.
  • Transform — duplex, который меняет данные на лету: zlib.createGzip().

Зачем

Файл на 2 ГБ через readFile займёт 2 ГБ памяти. Через поток в памяти лежит один чанк (по умолчанию 64 КБ), а отдавать ответ можно уже после первого чанка.

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

await pipeline(
  createReadStream('big.log'),
  createGzip(),
  createWriteStream('big.log.gz'),
);

Коротко для собеседования

Поток обрабатывает данные порциями и экономит память. Соединять потоки правильно через pipeline: он сам обрабатывает ошибки и закрывает ресурсы.

Другие вопросы раздела