Большинство клиентских пользовательских приложений общаются с сервером при помощи Запросов.
Для передачи данных большого размера с клиента на сервер обычно используется метод POST стандарта HTTP.
Иногда наступают такие ситуации, при которых данные не успевают приняться сервером. Из-за этого их дальнейшая обработка будет не корректной и мы можем получить undefined.
Решение задачи
Чтобы сказать серверу NodeJS дождаться данных, нужно использовать событийное программирование.
Ниже фрагмент кода из конфигурации NodeJS:
let data = »;
req.on(‘data’, chunk => {
data += chunk;
});
req.on(‘end’, () => {
res.statusCode = 200;
res.setHeader(‘Content-Type’, ‘text/html;charset=»utf8″‘);
res.end(JSON.parse(data).df);
});
Мы объявляем переменную data в которую будем дописывать строковые данные, поступающие с клиента.
Для удобства взаимодействия с данными мы напишем два обработчика событий.
- Первый будет отслеживать событие «поступления данных» — ‘data’
- Второй будет отслеживать событие «окончания поступления данных» — ‘end’
Пока данные будут приниматься кусочками, мы будем дописывать каждый кусочек в переменную data
Когда все кусочки придут с клиента, тогда мы прочитаем строку при помощи синтаксического анализатора JSON и его метода parse(). Когда строка станет объектом, тогда мы извлечём значение ключа df и отправим его обратно. (мы это делаем просто для примера, но по факту никто не отправляет данные назад на клиент … обычно данные идут куда-то глубже на сервер и там обрабатываются или складываются в базу данных)
Объекты req и res мы передаём заранее в нужный нам участок кода сервера. Месторасположение индивидуально и зависит от вашего проекта.
Как выглядят данные, отправляемые с клиента?
С клиентской стороны (с браузера) мы отправляем POST-запрос методом fetch() при помощи JavaScript.
При нажатии на кнопку мы получаем значение в поле ввода, затем формируем объект, превращаем его в строку JSON и отправляем на сервер.
let resp = await fetch(location.href, {
method: «POST»,
headers: [
[«Content-Type», «application/json»]
],
credentials: «include»,
body: JSON.stringify(obj)
});
Мы формируем для тела запроса объект вида:
{df: "https://efim360.ru"}
При успешном запросе следующие события будут сгенерированы на сервере в следующем порядке:
'socket'
'response'
'data'
любое количество раз, на объектеres
('data'
— «данные» вообще не будут отправлены, если тело ответа пусто, например, в большинстве переадресаций.)'end'
«конец» на объекте ответаres
'close'
Информационные ссылки
Стандарт NodeJS — Раздел «http.request(url[, options][, callback])» — https://nodejs.org/api/http.html#httprequesturl-options-callback