Какие типы потоков (streams) существуют в Node.js?

«Какие типы потоков (streams) существуют в Node.js?» — вопрос из категории Node.js Core, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Node.js есть четыре основных типа потоков, реализующих соответствующие абстракции:

  1. Readable — поток для чтения данных (например, из файла, HTTP-запроса).

    const fs = require('fs');
    const readableStream = fs.createReadStream('./input.txt');
  2. Writable — поток для записи данных (например, в файл, HTTP-ответ).

    const writableStream = fs.createWriteStream('./output.txt');
  3. Duplex — поток, который одновременно является и Readable, и Writable (например, TCP-сокет).

    const { Duplex } = require('stream');
    const myDuplex = new Duplex({
      read(size) { /* ... */ },
      write(chunk, encoding, callback) { /* ... */ }
    });
  4. Transform — особый тип Duplex-потока, предназначенный для модификации данных на лету (например, сжатие, шифрование).

    const { Transform } = require('stream');
    const upperCaseTransform = new Transform({
      transform(chunk, encoding, callback) {
        this.push(chunk.toString().toUpperCase());
        callback();
      }
    });

Потоки также могут работать в двух режимах:

  • Paused (остановленный): данные читаются только после вызова .read().
  • Flowing (текущий): данные автоматически передаются в обработчики событий, такие как 'data'.

Использование потоков критически важно для эффективной обработки больших объемов данных без загрузки всего набора в память, что является ключевым преимуществом Node.js.