Transform stream

Тема дорожной карты · Node.js

Поток Transform — это особый вид потока Duplex в модуле stream Node.js, в котором выходные данные вычисляются из входных, что делает его правильной абстракцией для операций модификации данных: сжатия, шифрования, парсинга и сериализации в конвейерах обработки данных серверных приложений. Для реализации пользовательского потока Transform в Node.js класс расширяет Transform и реализует метод _transform(chunk, encoding, callback), который принимает входные данные, применяет преобразование и вызывает this.push(result) для передачи преобразованных данных следующему потребителю. Встроенные потоки Transform в Node.js включают zlib.createGzip() и zlib.createGunzip() для сжатия, crypto.createCipheriv() для шифрования и подклассы stream.Transform в npm-пакетах csv-parse и JSONStream для конвертации форматов. Потоки Transform участвуют в том же механизме backpressure, что и потоки Readable и Writable, поэтому они естественно встраиваются в цепочки stream.pipeline() и корректно обрабатывают давление памяти даже при обработке многогигабайтных файлов в серверном сервисе Node.js. Поддержка TypeScript для пользовательских потоков Transform предоставляется через @types/node, который типизирует методы _transform и _flush, обеспечивая типобезопасную компоновку потоков в TypeScript-приложениях Node.js.

Как это работает

Transform stream в Node — это unix-pipe-подобные абстракции для инкрементальных данных: Readable, Writable, Duplex, Transform. Используйте, когда данные большие (GB-файлы, сетевые загрузки) или бесконечные (логи, websockets). Современный Node поддерживает stream/promises и pipeline() для безопасной композиции с обработкой ошибок и cleanup. Web Streams API (ReadableStream, WritableStream) доступен с Node 18 — тот же shape, что в браузере.

Когда применять

Streams — когда payload может превысить RAM: загрузки файлов, большие выборки из БД, CSV-импорт. pipeline() (не сырой .pipe()) — чтобы ошибки пробрасывались, ресурсы закрывались. Для HTTP-ответов можно return res.pipe(stream) — forward без буферизации. Пропустите streams для маленьких in-memory данных — overhead API больше выгоды; берите buffer или string.

Типичные ошибки

Ловушки Transform stream: забытый backpressure (медленный consumer, быстрый producer = раздутая память); .pipe() без error-обработчиков (тихий провал); смешение object-mode и binary-mode streams; конверсия stream → Buffer ради JSON.parse (теряет смысл). for await (const chunk of stream) в современном Node — читается чище, чем event-обработчики.

Связанные понятия

Полезные ресурсы