web-dev-qa-db-fra.com

Comment attraper net :: ERR_CONNECTION_REFUSED

Est-il possible d'attraper failed to load resource: net::ERR_CONNECTION_REFUSED, J'ai essayé:

try {
  $.post('',{},function(res) {
  }).fail(function (xhr, textStatus, errorThrown) { 
    xhr.textStatus = textStatus;
    xhr.errorThrown = errorThrown;
    console.log('fail',xhr);
    // how to get the 'ERR_CONNECTION_REFUSED' or anything else as string?
  });
} catch(e) {
  console.log('catch',e);
}

La fonction fail pourrait intercepter, mais je n'ai aucune information sur l'erreur, que ce soit:

  • ERR_NAME_NOT_RESOLVED
  • ERR_CONNECTION_REFUSED
  • ERR_BLOCKED_BY_CLIENT
  • ERR_TUNNEL_CONNECTION_FAILED (lors de l'utilisation d'un proxy)

ou quoi que ce soit d'autre .. la question serait, comment obtenir le genre d'erreur?

43
Kokizzu

J'ai même essayé d'atteindre l'objectif en utilisant javascript XMLHttpRequest()

var xhttp= new XMLHttpRequest();
try{
  xhttp.onreadystatechange = function() {
    console.log(xhttp);
    if (xhttp.readyState == 4 && xhttp.status == 0) {
      alert("Unknown Error Occured. Server response not received.");
    }
  };
  xhttp.open("POST", "http://localhost:8080/data", true);
  xhttp.send();
}catch(e){
  console.log('catch', e);
}

L'extrait ci-dessus ne donne que le traitement d'erreur générique, alors que je ne comprends pas la raison exacte de l'erreur. L'instruction try...catch Ne parvient pas à intercepter, car aucune des fonctions contenues dans le bloc try ne renvoie d'exceptions. Il semble que XMLHttpRequest s'exécute dans un thread d'arrière-plan, son erreur d'exécution est donc impossible à capturer.

Comme jQuery est une bibliothèque qui est en fait un javascript, elle se comportera également de la même manière pour $.post(), car $.post() utilise également XMLHttpRequest derrière le rideau.

Vous trouverez ci-dessous la version de jQuery, qui gérera également les erreurs génériques, car nous ne pouvons pas savoir exactement la raison de l’erreur.

try {
  $.post('http://localhost:8080/data', {}, function(res) {}).fail(function() {
      alert("Unknown Error Occured. Server response not received.");
  });
} catch (e) {
  console.log('catch', e);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Conclusion

Comme javascript XMLHttpRequest() n'est toujours pas assez efficace pour gérer différents états d'erreur, nous ne pouvons pas connaître la raison exacte de l'erreur réseau pour les requêtes AJAX. Nous ne pouvons capturer que les erreurs génériques et certains autres codes d'état connus comme

"404" pour fichier non trouvé

"500" pour le serveur ne répond pas

Plus d'informations peuvent être obtenues de https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

14
Kiran Shakya
var xhttp= new XMLHttpRequest();
xhttp.onreadystatechange = function() {
console.log(xhttp);

xhttp.onerror = function(e){
    alert("Unknown Error Occured. Server response not received.");
};

xhttp.open("POST", "http://localhost:8080/data", true);
xhttp.send();

Le gestionnaire d'événement onerror est un autre moyen d'obtenir des erreurs plus faciles à comprendre ultérieurement. D'après ce que j'ai vu, cela ne vous donnera pas plus d'informations utiles que la solution de Kirans.

5
Daniel Vestøl

Vous avez accès à en ligne/hors ligne en chrome.

var _Network_state = true;
    function updateIndicator() {
        // Show a different icon based on offline/online
        if (navigator.onLine) { // true|false
            // ... do other stuff
            _Network_state = true;
        } else {
            // ... do other stuff
            _Network_state = false;
        }
        console.info(_Network_state ? 'Online' : 'Offline');
    }
    // Update the online status icon based on connectivity
    window.addEventListener('online',  updateIndicator);
    window.addEventListener('offline', updateIndicator);
    updateIndicator();

Avant d’appeler ajax, examinez "_ Network_state"

0
Ariel Garcia