превышение тайм-аута ожидания ожидания - PullRequest
0 голосов
/ 07 апреля 2020

я получил следующий код внутри функции asyn c. когда я вызываю функцию, я застреваю после оператора ожидания. я уже проверил свой адрес nock на http req mocking, и он такой же, как в запросе.

        await new Promise((resolve) => {
            let req = http.request(reqUrl, function (res) {
                console.info('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) {
                        if (responseBody.trim() != '') {
                            if (responseBody === 'true') {
                                console.info('feature toggle is on');
                                self.evolveData.getByAttribute = self.evolveData.getByAttributeLimited;
                            } else {
                                console.info('feature toggle is off');
                            }
                        }
                    } else {
                        printErrorMessage('fail message', res, responseBody);
                        self.context.fail(responseBody);
                    }
                    resolve();
                });
                req.on('error', function () {
                    self.context.fail(responseBody);
                    resolve();
                });
            });
        });

1 Ответ

1 голос
/ 07 апреля 2020

Когда вы используете 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().

...