2016-09-08 3 views
17

Если fetch вызова терпит неудачу в Chrome, то только деталь ошибки, что я вернусь естьКак обрабатывать ошибки JavaScript Fetch?

TypeError: Failed to fetch

Как отобразить сообщение об ошибке информативного для конечного пользователя в этом случае?

В частности:

Можно ли получить какие-либо подробности о том, почему, не удалось?

Например, если сервер разбился, Chrome DevTools может регистрировать консольное сообщение net: ERR_EMPTY_RESPONSE, но, похоже, нет способа получить к нему доступ из JavaScript.

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

Можно ли отличать ошибки выборки от других TypeError?

Если я не могу получить информацию об ошибке, я бы хотел, по крайней мере, заменить ужасно неопределенное «Не удалось получить» с информативным сообщением «Не удалось получить доступ к веб-сайту, попробуйте еще раз позже», и я 'd хотел бы сделать это без какого-либо риска отображать это сообщение для других TypeError s.

Единственное, что я нашел здесь, это проверить фактический message, чтобы узнать, есть ли он "Failed to fetch". Это явно зависит от браузера; он работает в Chrome, похоже, что он будет работать на любом пользовательском языке Chrome, а другим браузерам потребуется собственное тестирование и обработка.

+5

'TypeError' кажется, что ... на самом деле неправильный тип ошибки. Странный. –

+0

'.catch' не подходит для вас? –

+0

@JaromandaX - '.catch' работает, но я хотел бы получить информацию об ошибке, если это возможно (мой первый вопрос), и чтобы избежать неправильной ловушки других' TypeError' как ошибок выборки, я чувствую, что мне нужно либо поставить '.catch' _very_ близко к' fetch' (так что никаких других ошибок не может возникнуть, таким образом теряя гибкость в том, как я структурирую свои обещания), или полагайтесь на поведение, специфичное для браузера, например текст сообщения «Отправить» (мой второй вопрос). –

ответ

6

Похоже, что нет более подробной информации о проблемах с сетью/разрешением/вводом.

Is it possible to distinguish fetch errors from other TypeErrors?

Да, вам просто нужно catch только ошибки от fetch вызова:

fetch(…) 
.catch(err => new FetchError(err)) 
.… 

class FetchError extends Error { 
    constructor(orig) { 
     super(); 
     this.message = "fetch error"; 
     this.details = orig; 
    } 
} 
+0

Также стоит проверить протокол выбранного URL-адреса. Вызов https: // на сайте http: // может вызвать эту ошибку. –

+0

Кроме того, проверка того, что ваши ответы '4XX' и' 5XX' не возвращают заголовок 'Access-Control-Allow-Origin: *', также могут быть причина. –

 Смежные вопросы

  • Нет связанных вопросов^_^