Запрос Node.js, почему ответ 400 перехватывается при попытке поймать

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

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

если я попытаюсь выполнить внутренний запрос непосредственно в почтальоне, я увижу ответ тела со статусом 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


person Kay    schedule 14.03.2019    source источник
comment
я вижу ответ тела со статусом 400, поэтому запрос выполнен успешно. Ответ 400: по определению ошибка.   -  person Jordan Running    schedule 15.03.2019


Ответы (1)


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
}
person Marcos Casagrande    schedule 14.03.2019
comment
Могу ли я просто подтвердить с вами, если запрос не работает полностью без ответа, я все еще хочу, чтобы это было поймано в попытке поймать. - person Kay; 14.03.2019
comment
добавление simple:false не сработало, плохой ответ 400 все еще перехватывается в блоке try catch. - person Kay; 14.03.2019
comment
Использование простого false работает для кода состояния 400. Так что либо вы используете старую версию, либо что-то еще происходит. Покажите трассировку стека. - person Marcos Casagrande; 14.03.2019