Переопределение Axios, получить код состояния из ответа данных вместо статуса - PullRequest
0 голосов
/ 10 февраля 2019

Я вызываю API, который определяет statusCode из данных вместо кода ответа:

{
  data: {
     statusCode: 422,
     message: "User's not found"
  }, 
 status: 200
}

В моем запросе получения axios вместо этого он получает код состояния из статуса.

return axios.get(`${process.env.BASE_URL}/users`)
      .then(response => {
        console.log(response);
      }).catch(err => {
        console.log(err.message);
      });

Я получаю ответ, но его нужно поймать, так как он 422.

Как я могу сослаться на statusCode ответа на данные, чтобы, если он не равен 200, его нужно было пойматьзаявление

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Вы можете перехватить ответ, проверить данные и выдать пользовательскую ошибку в этом случае:

// Add a response interceptor
axios.interceptors.response.use(function(response) {
    if (response.data && response.data.statusCode && !(response.data.statusCode >= 200 && response.data.statusCode < 300)) throw new Error()
    return response;
}, function(error) {
    return Promise.reject(error);
});

// Make a GET request
axios.get(url)
    .then((data) => {
        console.log('data', data)
    })
    .catch((e) => {
        console.log('error', e)
    })

Таким образом вы настраиваете свой экземпляр axios, поэтому вам не нужно повторяться для каждого отдельного запроса в вашемapp

Кроме того, вы можете изменить статус, используя следующий код. Но поскольку проверка состояния уже выполнена, она не выдаст ошибки при неправильных кодах состояния

// Add a response interceptor
axios.interceptors.response.use(function(response) {
    if (response.data && response.data.statusCode) response.status = response.data.statusCode
    return response;
}, function(error) {
    return Promise.reject(error);
});
0 голосов
/ 10 февраля 2019

Проверьте значение response.data.statusCode, если оно равно 442, то в идеале вы должны выбросить Error и разрешить его обработку в обратном вызове .catch.

return axios.get(`${process.env.BASE_URL}/users`)
      .then(response => {
        if(response.data.statusCode===442){
           throw new Error(response.data.message); //using throw instead of Promise.reject() to break the control flow. 
        }else{
           //return the data wrapped in promise
        }      
      })
      .catch((err) => {
          console.log(err.message);
          return Promise.reject(err.message);
      });
0 голосов
/ 10 февраля 2019

Вы можете справиться со стандартным оператором if внутри .then()

return axios.get(`${process.env.BASE_URL}/users`)
      .then(response => {
        if(response.data.statusCode===442){
           ...//custom error handling goes here
        }else{
           ...//if statusCode is a success one
        }      
      }).catch(err => {
        console.log(err.message);
      });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...