Есть 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.
Информационные ссылки
Стандарт NodeJS — https://nodejs.org/dist/latest-v19.x/docs/api/http.html#httprequesturl-options-callback
Стандарт ECMAScript — https://tc39.es/ecma262/multipage/ — https://tc39.es/ecma262/