2016-09-08 51 views
17

Jeśli fetch połączenia nie powiedzie się w Chrome, to tylko dane o błędach, które wrócę znaczyJak radzić sobie z błędami pobierania JavaScript?

TypeError: Failed to fetch

Jak mogę wyświetlić komunikat informacyjny dla użytkownika końcowego w tym przypadku?

Konkretnie:

Czy to możliwe, aby uzyskać żadnych szczegółów na temat dlaczego nieudanym pobieraniu?

Na przykład, jeśli serwer ulegnie awarii, Chrome DevTools może zarejestrować komunikat konsoli o sieci: ERR_EMPTY_RESPONSE, ale wydaje się, że nie ma możliwości uzyskania dostępu do tego z JavaScript.

O ile mi wiadomo, odpowiedź brzmi: nie; Zakładam, że dzieje się tak ze względów bezpieczeństwa, aby nie pozwolić złośliwemu JS dowiedzieć się, które strony są i nie są dostępne, sprawdzając komunikaty o błędach.

Czy można odróżnić błędy pobierania od innych numerów TypeError?

Jeśli nie mogę uzyskać informacji o błędach, chciałbym przynajmniej zastąpić strasznie niejasne "Nie można pobrać" z informacją "Nie można uzyskać dostępu do strony internetowej, spróbuj ponownie później", a ja chciałby to zrobić bez ryzyka wyświetlenia tego komunikatu dla innych TypeError s.

Jedyne rozwiązanie, które znalazłem tutaj, to sprawdzenie rzeczywistego message, aby sprawdzić, czy jest to "Failed to fetch". Jest to oczywiście zależne od przeglądarki; działa w Chrome, wygląda na to, że będzie działał w dowolnym języku przeglądarki Chrome, a inne przeglądarki będą wymagać własnych testów i obsługi.

+5

'TypeError' wydaje się ... naprawdę zły rodzaj błędu. Dziwne. –

+0

'.catch' nie działa dla ciebie? –

+0

@JaromandaX - ".catch' działa, ale chciałbym uzyskać informacje o błędzie, jeśli to możliwe (moje pierwsze pytanie), i aby uniknąć niepoprawnego przechwytywania innych" TypeError "jako błędów pobierania, czuję, że albo muszę umieścić '.catch' _very_ close to' fetch' (więc żadne inne błędy nie mogą wystąpić, tracąc w ten sposób elastyczność w sposobie budowania moich obietnic) lub polegać na zachowaniu specyficznym dla przeglądarki, takim jak tekst "wiadomości" pobierania (moje drugie pytanie). –

Odpowiedz

6

Wydaje się prawdopodobne, że nie ma więcej szczegółów dotyczących problemów z siecią/zezwoleniami/wprowadzaniem danych.

Is it possible to distinguish fetch errors from other TypeErrors?

Tak, wystarczy catch tylko błędy z rozmowy fetch:

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

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

Warto również sprawdzić protokół pobranego adresu URL. Wywołanie https: // w witrynie http: // może spowodować ten błąd. –

+0

Sprawdzanie, czy odpowiedzi '4XX' i' 5XX' nie zwracają nagłówka 'Access-Control-Allow-Origin: *' może być również przyczyna. –