Node.js Запрос, почему 400 ответов перехватываются в try catch - PullRequest
0 голосов
/ 14 марта 2019

Я делаю http-запрос к бэкэнду.Запрос возвращает 400 с телом, сообщающим мне, почему это был неправильный запрос.

Но почему он попадает в ловушку try, почему не возвращается в метрической переменной.

Если я пытаюсь выполнить внутренний запрос непосредственно в почтальоне, я могу увидеть ответ тела с помощью 400статус, поэтому запрос выполнен успешно.Я предполагал, что запросы перехватываются, только если они не успешны.

 public async processMetrics(sessionId: any, side: any): Promise<any> {

        try {

                metrics = await this.getMetrics(session._id, sessionRequest._id);
                // Metrics not returned here               
        } catch (err) {
            console.log("CAUGHT 400");


        }

    }

-

public async getMetrics(sessionId: any, requestId: any): Promise<any> {

    const url = this.config.backendUrl + "/check/metrics";

    const options = {
        uri: url,
        headers: {
            "X-IDCHECK-SESSION_ID": sessionId,
        },
        body: {},
        json: true,
        resolveWithFullResponse: true,
    };

    return request.get(options);

}

Я использую пакет запроса - https://github.com/request/request https://github.com/request/request-promise-native

1 Ответ

1 голос
/ 14 марта 2019

request-promise будет отклонено, если код состояния не равен 2xx. Чтобы избежать этого, вы должны передать simple: false в качестве опции.

Вы можете проверить это в документации

var options = {
    uri: 'http://www.google.com/this-page-does-not-exist.html',
    simple: false    //  <---  <---  <---  <---
};

rp(options)
    .then(function (body) {
        // Request succeeded but might as well be a 404
        // Usually combined with resolveWithFullResponse = true to check response.statusCode
    })
    .catch(function (err) {
        // Request failed due to technical reasons...
    });

Если запрос не завершен, нет ответ, я все еще хочу, чтобы это было поймано в попытке поймать

public async getMetrics(sessionId: any, requestId: any): Promise<any> {

    const url = this.config.backendUrl + "/check/metrics";

    const options = {
        uri: url,
        headers: {
            "X-IDCHECK-SESSION_ID": sessionId,
        },
        body: {},
        json: true,
        simple: false,
        resolveWithFullResponse: true,
    };

    const response = await request.get(options);

    if(!response.body)
       throw new Error('Empty body');

    return response
}
...