NodeJS | Как дождаться данных из тела POST-запроса, чтобы не получить undefined? — efim360.ru

NodeJS | Как дождаться данных из тела POST-запроса, чтобы не получить undefined?

Большинство клиентских пользовательских приложений общаются с сервером при помощи Запросов.

Для передачи данных большого размера с клиента на сервер обычно используется метод 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 мы передаём заранее в нужный нам участок кода сервера. Месторасположение индивидуально и зависит от вашего проекта.

 

Как выглядят данные, отправляемые с клиента?

Простая форма для отправки строки доменного имени на сервер - input url и input submit - HTML
Простая форма для отправки строки доменного имени на сервер - input url и input submit - HTML

С клиентской стороны (с браузера) мы отправляем 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"}
Объект для тела POST-запроса в NodeJS
Объект для тела POST-запроса в NodeJS

 

При успешном запросе следующие события будут сгенерированы на сервере в следующем порядке:

  • 'socket'
  • 'response'
    • 'data' любое количество раз, на объекте res  ('data' - «данные» вообще не будут отправлены, если тело ответа пусто, например, в большинстве переадресаций.)
    • 'end' «конец» на объекте ответа res
  • 'close'

 

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

Стандарт NodeJS - Раздел "http.request(url[, options][, callback])" - https://nodejs.org/api/http.html#httprequesturl-options-callback