advanced
Streams
Обрабатывайте данные incrementally через readable, writable, duplex, transform streams, pipelines, errors и backpressure.
Streams обрабатывают данные порциями, не загружая весь payload в память. В Node четыре базовых типа:
| Тип | Роль | |------|------| | Readable | Источник — `read()`, `'data'`, `'end'` | | Writable | Приёмник — `write()`, `end()`, события drain | | Duplex | Независимые чтение/запись (например TCP socket) | | Transform | Duplex с преобразованием (gzip, JSON lines) |
Предпочитайте `stream/promises.pipeline` для автоматической передачи ошибок и очистки:
import { createReadStream } from 'node:fs';
import { createGzip } from 'node:zlib';
import { pipeline } from 'node:stream/promises';
await pipeline(
createReadStream('access.log'),
createGzip(),
createWriteStream('access.log.gz'),
);
Object mode передаёт объекты JavaScript вместо Buffer/string — удобно для ETL, опасно, если producer обгоняет consumer.
На интервью: почему streaming лучше `readFile` для больших файлов; как backpressure замедляет producer; чем `pipeline` отличается от ручного `.pipe()`.
Типовые ошибки: `'data'` без pause и переполнение памяти; нет обработчиков `'error'` на звеньях pipe; смешение callback и promise API без await pipeline.
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Назовите четыре типа и пример применения.
- Используйте `pipeline` для безопасной композиции.
- Обрабатывайте `'error'` на каждом участке.
- Учитывайте возврат `write()` и `'drain'`.