Модуль запроса возвращает дополненные нативные объекты.Возвращаемым значением является расширенный http.ClientRequest
объект (вид), а обратный вызов предоставляется расширенным http.IncomingMessage
в качестве второго аргумента.Вы можете использовать различные свойства для восстановления ответа, но вы не можете получить его напрямую отсюда.Собственный http API, который предоставляет Node, абстрагирует от необработанного ответа.
(Документы для IncomingMessage
и ClientRequest
здесь: https://nodejs.org/api/http.html).
Что еще интереснее, это обе абстракции над net.Socket
. Если вы используете собственный http
API,Вы можете прослушать этот Socket
перед отправкой ClientRequest
(с .end
). Это даст вам Buffer
, содержащий ответ HTTP.
let http = require("http");
let nativeRequest = http.get({
host: "google.com"
}); //get a ClientRequest object
nativeRequest.on('socket', function (socket) {
socket.on('data', function (data) { console.log(data.toString()); });
});
nativeRequest.end();
Это не похоже наэто позволяет вам отслеживать исходящий запрос, но отлично работает для ответа.
Возвращаясь вверх по цепочке абстракций, это прекрасно работает с запросом. Я пропущу фрагмент, потому что он почти идентичен обоимпредыдущий и последующий.
Чтобы получить запрос, мы можем покопаться во внутренних элементах сокета, чтобы узнать, не можем ли мы чем-то злоупотребить. Object.keys(socket)
возвращает следующий массив:
[
"connecting",
"_hadError",
"_handle",
"_parent",
"_host",
"_readableState",
"readable",
"domain",
"_events",
"_eventsCount",
"_maxListeners",
"_writableState",
"writable",
"allowHalfOpen",
"destroyed",
"_bytesDispatched",
"_sockname",
"_pendingData",
"_pendingEncoding",
"server",
"_server",
"parser",
"_httpMessage"
]
И, действительно, если мы посмотрим на подозрительно выглядящий _pendingData
, мы сможем просмотреть запрос до его отправки:
let request = require('request');
let req = request("http://google.com", function (e, r, d) {});
req.on('socket', function (socket) {
console.log("========\nRequest\n========")
console.log(JSON.stringify(socket._pendingData, null, 3));
console.log("========\nResponse\n========");
socket.on('data', function (data) { console.log(data.toString()); });
});