Когда вы используете http.request()
, вам нужно позвонить req.end()
, чтобы фактически инициировать запрос и отправить его. Обратите внимание, что если вы переключитесь на http.get()
, вам не нужно будет звонить req.end()
, потому что http.get()
сделает это за вас.
Вот отдельная программа, которая демонстрирует:
const http = require('http');
async function run() {
await new Promise((resolve) => {
let req = http.request("http://www.google.com", function (res) {
console.log('Start http GET request');
var responseBody = '';
res.setEncoding('utf8');
// Read the response body
res.on('data', function (data) {
responseBody += data;
});
res.on('end', function () {
console.info('feature toggle response code ' + res.statusCode);
if (res.statusCode === 200) {
console.log("got 200 response")
}
resolve();
});
});
req.on('error', function () {
console.log("error");
resolve();
});
req.end(); // <=== You were missing this
});
console.log("after await");
}
run();
Если вы удалите req.end()
, чтобы он пропал, как в вашем коде, вы получите то же самое. Обещание никогда не разрешается, потому что запрос никогда не отправляется.
Также, для полноты, обратите внимание, что req.on('error', ...)
должен быть на более высоком уровне (вне обратного вызова http.request()
), чтобы вы могли получить ошибки, которые могут произойти до вызова обратного вызова или в случаях, когда обратный вызов не вызван из-за ошибки.
К вашему сведению, пара делает c ссылки:
С do c для http.request()
:
С http.request () всегда нужно вызывать req.end()
, чтобы обозначить конец запроса - даже если есть данные не записываются в тело запроса.
Из do c для http.get()
:
Единственное отличие этого метода http.request()
означает, что метод устанавливает GET и автоматически вызывает req.end()
.