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'`.