Comment gérer les erreurs JavaScript Fetch?

Si fetch l'appel échoue dans Chrome, alors les seuls détails d'erreur que je récupère sont

TypeError: échec de fetch

Comment puis-je afficher un message d'erreur informatif à l'utilisateur final dans ce cas?

plus Précisément:

est-il possible d'obtenir des détails sur la raison pour laquelle fetch a échoué?

par exemple, si le serveur s'est écrasé, Chrome DevTools pourrait enregistrer un message de net: ERR_EMPTY_RESPONSE, mais il semble qu'il n'y ait aucun moyen d'accéder à cela à partir de JavaScript.

autant que je puisse dire, la réponse est Non; Je suppose que c'est pour des raisons de sécurité, pour éviter de laisser des js malveillants découvrir quels sites sont et ne sont pas accessibles en inspectant les messages d'erreur.

Est-il possible de distinguer chercher les erreurs des autres TypeError s?

si Je ne peux pas obtenir les détails d'erreur, je voudrais au moins remplacer l'horriblement vague " N'a pas réussi à fetch "with an informative" N'a pas accédé au site web; s'il vous plaît réessayez plus tard" message, et je voudrais le faire sans aucun risque d'afficher ce message pour les autres TypeError S.

la seule solution que j'ai trouvée ici est de vérifier lemessage pour voir si c'est "Failed to fetch". Cela est évidemment spécifique au navigateur; il fonctionne dans Chrome, il semble que cela fonctionnera dans n'importe quelle langue d'utilisateur de Chrome, et d'autres navigateurs auraient besoin de leur propre test et la manipulation.

19
demandé sur Bergi 2016-09-08 17:42:28

1 réponses

il semble probable qu'il n'y ait pas plus de détails pour les problèmes de réseautage/permission/entrée.

est-il possible de distinguer les erreurs fetch des autres TypeErrors?

Oui, vous avez juste besoin d' catch seulement les erreurs de fetch appel:

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

class FetchError extends Error {
    constructor(orig) {
        super();
        this.message = "fetch error";
        this.details = orig;
    }
}
7
répondu Bergi 2016-09-08 15:27:46