Catch() не обрабатывает 404

Я делаю скрипт для получения некоторых данных из моего API:

const success = (response) => {
  console.log(response);
};

const failed = (error) => {
  console.log(error);
};

axios.$http.get('/somedata')
  .then((response) => {
    success(response.data);
  })
  .catch((error) => {
    failed(error);
  });

/somepage — это несуществующая страница, поэтому она возвращает ошибку 404. Но загвоздка не в том, чтобы обработать это. Почему нет? В моей консоли у меня есть ошибка TypeError: Cannot read property 'data' of undefined. Почему не работает функция failed()? Я не понимаю.


person Jordy    schedule 02.12.2016    source источник
comment
Возможный дубликат Promise : then vs then + catch   -  person CMedina    schedule 03.12.2016
comment
какую версию аксиоса вы используете?   -  person roger    schedule 03.12.2016
comment
Последняя версия: 0.15.2   -  person Jordy    schedule 03.12.2016
comment
кажется, это потенциально было проблемой в прошлом, взгляните на эту тему: github.com/ mzabriskie/axios/issues/41 и, возможно, проверьте, что установлено в вашей конфигурации 'validateStatus' (информацию об этом можно найти в README: github.com/mzabriskie/axios/blob/master/README.md)   -  person roger    schedule 03.12.2016
comment
Спасибо, смотрите мой собственный ответ. Вы указали мне правильное направление ;)   -  person Jordy    schedule 03.12.2016
comment
404 ответа - это не ошибка, это правильный ответ   -  person Velimir Tchatchevsky    schedule 10.10.2018
comment
Возможный дубликат fetch разрешается, даже если 404?   -  person Velimir Tchatchevsky    schedule 10.10.2018


Ответы (3)


Судя по сообщению об ошибке, это выглядит как "success(response.data);" вызывается. Возможно ли, что сервер успешно возвращает страницу, которая говорит что-то вроде «Ошибка 404», а не возвращает код ответа HTTP 404?

person Rocky Sims    schedule 02.12.2016

Выяснилось, что это связано с пользовательским перехватчиком, обрабатывающим ошибки 401 (но не ошибки 404)...

person Jordy    schedule 02.12.2016
comment
Предположительно, вы имеете в виду... специальный перехватчик, который предназначен для обработки ошибок 401 и который должен повторно выдавать все остальные... но не делает этого? - person Roamer-1888; 03.12.2016

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

axios.$http.get('/somedata')
  .then(response => {
    if(response.status !== 404) //or any status code really
        success(response.data);
    else
        failed(response)
  })
  .catch((error) => {
    failed(error);
  });

Опять же, что вы, вероятно, захотите проверить, так это убедиться, что возвращается 200.

axios.$http.get('/somedata')
  .then(response => {
    if(response.status === 200)
        success(response.data);
    else
        failed(response)
  })
  .catch((error) => {
    failed(error);
  });
person devilfart    schedule 04.12.2016