Предполагается, что на сервере мы динамически генерируем файлы с обычным текстовым содержимым и отправляем их на клиент. И однажды может наступить такая ситуация, при которой, например, размер динамического HTML-файла может запросто превысить 5 мегабайт. Это очень много для строки.
Проблема заключается в том, что мы не можем заранее знать на каком устройстве и на каком браузере будет приниматься и рендериться этот самый файл. Чтобы подстраховаться и не «потопить» браузер пользователя мы можем отправлять данные не все сразу, а по кусочкам (по чанкам — chunk)
На сервере NodeJS в основном файле приложения или в его модуле мы подключаем модуль:
const { Readable } = require('stream'); или const { Readable } = require('node:stream');
Теперь, в нужном нам обработчике, мы можем произвести отдачу контента в автоматическом режиме.
const readable = Readable.from(['НАША СТРОКА']); readable.on('data', chunk => { res.statusCode = 200; res.setHeader('Content-Type', 'text/html'); res.end(chunk) });
Обращаемся к потоку чтения. Мы передаём в метод from()
нужную нам строку, которую погружаем в массив. В массиве будет одна строка.
Метод on()
используется для регистрации слушателей событий. Мы будем слушать событие ‘data
‘.
Событие ‘data
‘ генерируется всякий раз, когда поток передает право собственности на блок данных потребителю. Это может происходить всякий раз, когда поток переключается в текущий режим путем вызова readable.pipe()
, readable.resume()
или путем присоединения обратного вызова прослушивателя к событию ‘data
‘. Событие data также будет генерироваться всякий раз, когда вызывается метод readable.read()
и доступен для возврата фрагмент данных.
Информационные ссылки
Стандарт NodeJS — Модуль «Stream» — https://nodejs.org/dist/latest-v18.x/docs/api/stream.html
Стандарт NodeJS — Раздел «stream.Readable.from(iterable, [options])» — https://nodejs.org/dist/latest-v18.x/docs/api/stream.html#streamreadablefromiterable-options
Стандарт NodeJS — Раздел «Event: ‘data’» — https://nodejs.org/dist/latest-v18.x/docs/api/stream.html#event-data