2015-02-17 14 views
32

c'è un modo per catturare failed to load resource: net::ERR_CONNECTION_REFUSED, ho provato:Come catturare Net :: ERR_CONNECTION_REFUSED

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); 
} 

fail funzione potrebbe prendere, ma ho avuto alcuna informazione circa l'errore, o è:

  • ERR_NAME_NOT_RESOLVED
  • ERR_CONNECTION_REFUSED
  • ERR_BLOCKED_BY_CLIENT
  • E RR_TUNNEL_CONNECTION_FAILED (quando si utilizza il proxy)

o qualsiasi altra cosa .. la domanda sarebbe, come ottenere il tipo di errore?

+1

Non otterrete informazioni specifiche sull'errore, per intento (perché altrimenti potrebbe essere abusato per ottenere informazioni sulla rete interna dell'utente, ad esempio). – robertklep

risposta

11

Ho anche cercato di raggiungere l'obiettivo utilizzando 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); 
 
}

Sopra frammento dà solo la gestione degli errori generici, mentre io non sono sempre motivo esatto dietro l'errore. L'istruzione try...catch non riesce a rilevare nulla, poiché nessuna delle funzioni nel blocco try genera eccezioni. Sembra che XMLHttpRequest sia in esecuzione in background thread, quindi il suo errore di runtime non è rilevabile.

Come jQuery è una libreria che in realtà è un javascript, si comporterà anche per $.post() perché $.post() utilizza anche XMLHttpRequest dietro il sipario.

Di seguito è riportata la versione jQuery, che gestirà anche l'errore generico, in quanto non è possibile conoscere esattamente il motivo dell'errore.

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>

Conclusione

come JavaScript XMLHttpRequest() non è ancora abbastanza efficiente per la gestione di diversi stati di errore, non possiamo sapere motivo esatto dietro l'errore di rete per le richieste AJAX. Siamo in grado di catturare solo gli errori generici e di alcuni altri codici di stato noto come

"404" per il file non trovato

"500" per il server non risponde

Più può essere conosciuto da https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

+2

Sono abbastanza sicuro che lo stato() non ha nulla a che fare con la rete, ma con l'oggetto rinviato. Il "respinto" significa che l'oggetto posticipato è stato respinto anziché risolto. – Claudio

+0

Ok ho capito.Grazie per aver menzionato @Claudio. Puoi suggerire un modo per controllare il rifiuto dalla rete? –

+0

No :( Anche io sto combattendo dietro a questo problema e sfortunatamente non c'è una soluzione a cui possa pensare. Forse indagherò su websocket per vedere se la diagnosi di un problema di rete potrebbe essere un po 'più interessante .. – Claudio

3
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(); 

Un modo alternativo per ottenere errori che potrebbero essere più facili da comprendere in seguito è il gestore di eventi onerror. Da quello che ho visto, non ti darà più informazioni utili della soluzione di Kirans.

+0

Grazie, almeno rileva che si è verificato un errore (a differenza di try-catch around .send che doensn't sembrano catturare). La mia unica preoccupazione è il supporto del browser per questo. Se non disponibile, in quale altro modo si rileva un errore a livello di rete oltre all'uso dei timeout? Potrebbe valere la pena controllare come $ .ajax lo rilevi prima di fallire la promessa. – Shane

Problemi correlati