Что такое 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: он сам обрабатывает ошибки и закрывает ресурсы.