Node JS | Как отправить большую строку на клиент?

Предполагается, что на сервере мы динамически генерируем файлы с обычным текстовым содержимым и отправляем их на клиент. И однажды может наступить такая ситуация, при которой, например, размер динамического HTML-файла может запросто превысить 5 мегабайт. Это очень много для строки.

Проблема заключается в том, что мы не можем заранее знать на каком устройстве и на каком браузере будет приниматься и рендериться этот самый файл. Чтобы подстраховаться и не «потопить» браузер пользователя мы можем отправлять данные не все сразу, а по кусочкам (по чанкам — chunk)

На сервере Node JS в основном файле приложения или в его модуле мы подключаем модуль:

const { Readable } = require('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() и доступен для возврата фрагмент данных.

Информационные ссылки

Стандарт Node JS — Раздел «stream.Readable.from(iterable, [options])» — https://nodejs.org/dist/latest-v16.x/docs/api/stream.html#stream_stream_readable_from_iterable_options

Стандарт Node JS — Раздел «Event: ‘data’» — https://nodejs.org/dist/latest-v16.x/docs/api/stream.html#stream_event_data

Поделись записью