NodeJS | Как передать свои параметры в функцию-обработчик HTTP-ответа через метод привязки объекта контекста bind() в HTTP-запросе?

NodeJS | Как передать свои параметры в функцию-обработчик HTTP-ответа через метод привязки объекта контекста bind() в HTTP-запросе?

Есть NodeJS код, который рассылает HTTP-запросы на разные сайты. Код организован в один класс, с кучей разных методов.

Один из методов занимается отправкой HTTP-запроса с учётом полученного объекта из базы данных. Его код примерно такой:

send_http_request(obj){
  let new_http_request;
  if (obj.url.match(/^https.*/)){
    new_http_request = https.request(
      obj.url,
      this.gethttpresponse.bind(this, obj)
    )
  } else {
    new_http_request = http.request(
      obj.url,
      this.gethttpresponse.bind(this, obj)
    )
  }
  // ... тут какая-то логика ... обработчики событий и т.п.
  new_http_request.end();
}

Тут суть проста. Приняли объект из базы и у него вытащили URL для отправки. Сравнили URL на принадлежность к URI-схеме (протоколу) и потом вызвали HTTP-запрос в коде.

Переписывать какой-то один ключ экземпляра класса не представляется возможным, так как нет гарантий, в какой момент времени завершится тот или иной запрос. Поэтому нужно передавать информацию дальше.

Функция-обработчик HTTP-ответа также вынесена в коде отдельно для простоты корректирования и настройки. Она примерно такая:

gethttpresponse(obj, httpresponse){
   // какая-то логика действий
}

 

Какая проблема?

Так вот проблема в том, что стандартный обработчик HTTP-ответа на событие ‘response‘ (для HTTP-запроса) ожидает получить объект HTTP-ответа первым параметром. И единственным.

Если мы в «this.gethttpresponse.bind(this, obj)» закидываем более одного параметра, тогда наш объект HTTP-ответа будет сдвинут в самый конец всех возможных параметров в функции-обработчике HTTP-ответа.

В этом примере в bind мы передаём первым параметром объект контекста для будущего вызова обработчика ответа. А вторым параметром мы хотим пробросить в обработчик ответа свой объект.

Так вот этот свой объект станет первым в обработчике «gethttpresponse(obj, httpresponse)», а сам ответ — вторым «gethttpresponse(obj, httpresponse)». То есть ответ будет последним параметром.

Стало быть, чем больше параметров мы закидываем в bind, тем сильнее сдвигается положение параметра HTTP-ответа.

Это нужно учитывать в разработке.

К сожалению, документация NodeJS скудновата и не предлагает разных вариантов написания кода обработки HTTP-ответов. В документации не расписана сама логика работы методов так как это сделано в ECMAScript.

 

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

Стандарт NodeJShttps://nodejs.org/dist/latest-v19.x/docs/api/http.html#httprequesturl-options-callback

Стандарт ECMAScripthttps://tc39.es/ecma262/multipage/https://tc39.es/ecma262/