2009-01-02 10 views
23

Lassen Sie sich sagen, dass ich den folgenden jQuery AJAX-Aufruf habe:Wie gehen Sie mit Fehlern von AJAX-Anrufen um?

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    } 
}); 

Nun, wenn dieser AJAX-Aufruf wird ich möchte, dass der serverseitigen Code durch ein paar Fehlerbehandlung Kontrollen ausführen (zB wird der Benutzer noch angemeldet , haben sie die Erlaubnis, diesen Anruf zu benutzen, sind die Daten gültig, usw.). Wenn ein Fehler festgestellt wird, wie kann ich diese Fehlermeldung wieder auf die Clientseite übertragen?

Mein erster Gedanke wäre, ein JSON-Objekt mit zwei Feldern zurückzugeben: Fehler und ErrorMessage. Diese Felder würden dann in dem jQuery AJAX-Aufruf überprüft werden:

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     if (result.error == "true") 
     { 
      alert("An error occurred: " & result.errorMessage); 
     } 
     else 
     { 
      // Do stuff 
     } 
    } 
}); 

Das fühlt sich ein bisschen klobig zu mir, aber es funktioniert. Gibt es eine bessere Alternative?

Antwort

23

Persönlich habe ich ähnlichen Code zu dem folgenden Code in meiner Bibliothek.

$.ajaxSetup({ 
    error: function(xhr){ 
     alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText); 
    } 
}); 

jQuery docs Ajax/jQuery.ajaxSetup

Der beste Weg, um Blase, die Fehler von der Serverseite (mit PHP) auf der Client-Seite ist ein Kopf durch die Ajax-Anfrage in der (von 400 irgendwo zu senden, die mit immer verbunden ist, Fehler). Sobald die Ajax-Anfrage dies empfängt, löst sie Ihre Fehlerfunktion aus. Das bedeutet auch, dass Sie keinen Fehler definieren müssen: Rufen Sie jeden $ .ajax Aufruf auf.

header('HTTP/1.0 419 Custom Error'); 

Zitat von w3.org header information

Fehlern 4xx, 5xx Die 4xx-Codes für die Fälle vorgesehen, in denen der Kunde Fehler begangen zu haben scheint, und der 5xx-Codes für die Fälle, in denen der Server bekannt ist, dass der Server hat sich geirrt. Es ist unmöglich, diese Fälle im Allgemeinen zu unterscheiden, so dass der Unterschied nur informativ ist. Der Body-Abschnitt kann ein Dokument enthalten, das den Fehler in lesbarer Form beschreibt. Das Dokument ist im MIME-Format und darf nur in text/plain, text/html oder für die in der Anfrage als akzeptabel angegebenen Formate vorliegen.

3

Akzeptiert die jQuery-AJAX-Funktion am Ende einen weiteren Parameter, einen Rückruf für fehlgeschlagene Anrufe? Wenn ja, fügen Sie nach dem Erfolgsrückruf einfach eine fail:function(...){..} hinzu.

+0

Ich glaube, es gibt auch eine für "Fehler." – BobbyShaftoe

+0

Ja, es gibt einen "Fehler" -Rückruf, der genauso funktioniert wie der "Erfolg" -Rückruf. Ich war mir jedoch nicht sicher, ob die Rückgabe eines HTTP-Fehlers der beste Ansatz war. –

+0

Solange Sie sich um den Fehler auf der Serverseite kümmern (Protokollierung usw.), gibt es kein Problem beim Senden an den Client, so dass es auch behandelt werden kann. – rodbv

0

Geben Sie einen Fehlercode auf der Serverseite mit dem HTTP-Fehler zurück, der am besten mit dem Fehler übereinstimmt. Dann benutze den Fehler Callback. Dadurch können Sie auch Fehler Ihres Webservers anzeigen.

5
$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    }, 
    error: function(request,status,errorThrown) { 
     // There's been an error, do something with it! 
     // Only use status and errorThrown. 
     // Chances are request will not have anything in it. 
    } 
}); 
+1

Bei mir ist der Status immer "error" und errorThrown ist immer undefiniert. Wie bekommen Sie hier interessante Informationen? –

+0

Siehe: http://api.jquery.com/jQuery.ajax/, Fehler –

+0

Beachten Sie auch, dass "request.status" den Fehlercode enthält. –

0

Es ist ziemlich spät, um diese Frage zu beantworten, aber ich denke, es wird nützlich sein, jemand mit es6 und jquery 2.2.

ich folge in der Regel diesem (latenten Ansatz) in meinem Code

sendAjaxRequest(URL, dataToSend) { 
    return $.ajax({ 
     type  : 'POST', 
     url   : URL, 
     data  : JSON.stringify(dataToSend), 
     dataType : 'json' 
    }).fail((responseData) => { 
     if (responseData.responseCode) { 
      console.error(responseData.responseCode); 
     } 
    }); 
}, 

Ich habe ein latenten fail Verfahren angebracht, die aufgerufen werden, wenn ein Fehler auftritt. Es ist ein alternatives Konstrukt für die Fehlerrückrufoption, die .fail() -Methode ersetzt die veraltete .error() -Methode in der letzten jQuery.

Weiter vom Ort der sendAjaxRequest Aufruf Ich benutze then jquery Versprechen Rückruf

sendAjaxRequest(URL, dataToSend) 
.then(
    (success) => { 
    }, 
    (error) => { 
    } 
); 

Es wird Erfolgs- oder Fehlerfunktion aufrufen basierend auf der Antwort vom Server empfangen.

Verwandte Themen