Wie erhalte ich den jQuery $ .ajax-Fehlerantworttext?


234

Ich sende eine Fehlerantwort an meine jQuery. Ich kann jedoch den Antworttext nicht erhalten (im folgenden Beispiel wäre dies an den Strand gegangen ).

Das einzige, was jQuery sagt, ist "Fehler".

In diesem Beispiel finden Sie Details:

php

<?
    header('HTTP/1.1 500 Internal Server Error');
    print "Gone to the beach"
?>

jQuery

$.ajax({
    type:     "post",
    data:     {id: 0},
    cache:    false,
    url:      "doIt.php",
    dataType: "text",
    error: function (request, error) {
        console.log(arguments);
        alert(" Can't do because: " + error);
    },
    success: function () {
        alert(" Done ! ");
    }
});

Jetzt ist mein Ergebnis:

Log:

 [XMLHttpRequest readyState=4 status=500, "error", undefined]

aufmerksam:

Kann nicht, weil: Fehler

Irgendwelche Ideen?


Das Problem scheint in Ihrem PHP-Code zu liegen. Benötigen Sie keine 2 Zeilenumbrüche zwischen Überschriften und dem Textkörper? Behandelt die headerFunktion dies?
Rfunduk

thenduks: PHP weiß was es tut. Das Problem ist, dass, da der zurückkommende HTTP-Status 500 ist, $.ajax()die an ihn übergebene Fehlerfunktion aufgerufen wird.
Chris Charabaruk

Antworten:


309

Versuchen:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");
  alert(err.Message);
}

127
Ich bevorzuge JSON.parse (xhr.responseText)
Phil-R


19
Die Verwendung eines evalHier macht nicht viel Sinn. Wenn Sie eine JSON-Antwort analysieren möchten, verwenden Sie JSON.parse. Im Fall des OP ist die Antwort nicht einmal JSON oder JavaScript, daher evalwird nur ein SyntaxError verursacht.
Mark Amery

1
JSON.parse benötigt IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Wenn Unterstützung für ältere Browser benötigt wird, verwenden Sie $ .parseJSON (von jQuery, api.jquery.com/jQuery.parseJSON )
Julian

1
ändert nichts an der Tatsache, dass xhrundefiniert ist
phil294

53

Für mich funktioniert das einfach:

error: function(xhr, status, error) {
  alert(xhr.responseText);
}

51

Sehen Sie sich die responseTextEigenschaft des Anforderungsparameters an.


Ich habe ein 'Parsererror'-Problem in IE8, arbeite aber in IE7 für eine originenübergreifende JSONP-Anfrage. Aber wo ist die responseText-Eigenschaft? Ich sehe es nirgendwo, während ich das Antwortobjekt während des Debuggens überprüfe. Ich sehe nur readyState, status, statusText und die anderen Methoden des Anforderungsobjekts $ .ajax ().
NLV

Das xhr-Objekt sollte je nach MIME-Typ der Antwort entweder responseText oder responseXML haben.
Tvanfosson

Ich habe das Problem gefunden. In der Realität erstellt jquery beim Erstellen einer JSONP-Anforderung überhaupt kein XHR-Objekt. JSON-Padding ist nur, dass dynamische Skriptreferenzen hinzugefügt werden, die auf die URL verweisen, und die JSON-Daten mit einer Methode umbrochen werden, die aufgerufen wird. XHR wird also überhaupt nicht verwendet.
NLV

Haben Sie ein Problem mit IE8 und Cross-Origin. Verbrachte heute den ganzen Tag :(. Stackoverflow.com/questions/8165557/…
NLV

Wie analysiert man repsponseText in ein JSON-Objekt?
Chovy


7

Das hat bei mir funktioniert

    function showErrorMessage(xhr, status, error) {
        if (xhr.responseText != "") {

            var jsonResponseText = $.parseJSON(xhr.responseText);
            var jsonResponseStatus = '';
            var message = '';
            $.each(jsonResponseText, function(name, val) {
                if (name == "ResponseStatus") {
                    jsonResponseStatus = $.parseJSON(JSON.stringify(val));
                     $.each(jsonResponseStatus, function(name2, val2) {
                         if (name2 == "Message") {
                             message = val2;
                         }
                     });
                }
            });

            alert(message);
        }
    }

2
xhr.responseJSON ist ebenfalls verfügbar. So können wir $ .parseJSON (xhr.responseText)
Prasanth

4

Auf diese Weise können Sie die gesamte Antwort sehen, nicht nur den Wert "responseText"

error: function(xhr, status, error) {
    var acc = []
    $.each(xhr, function(index, value) {
        acc.push(index + ': ' + value);
    });
    alert(JSON.stringify(acc));
}

3

Sie können es auch versuchen:

$(document).ajaxError(
    function (event, jqXHR, ajaxSettings, thrownError) {
        alert('[event:' + event + '], [jqXHR:' + jqXHR + '], [ajaxSettings:' + ajaxSettings + '], [thrownError:' + thrownError + '])');
    });

3

Wenn Sie einen Syntaxfehler mit Zeilennummer erhalten möchten , verwenden Sie diese Option

error: function(xhr, status, error) {
  alert(error);
}

Ich habe keine Zeilennummer erhalten, aber "alert (error)" gab mir ein "Not Found", als ich $ .get anrief, um eine Datei zu lesen, was ich brauchte. Der xhr.responseText hat eine 404-Seite zurückgegeben, die mir mitteilt, dass die Datei nicht vorhanden ist.
James Toomey

Hallo James, wenn der Fehler "Nicht gefunden" ausgelöst wird, bedeutet dies, dass die Methode "URL" oder "Aktion" nicht gefunden werden kann.
Karthikeyan P

3

Der beste einfache Ansatz:

error: function (xhr) {
var err = JSON.parse(xhr.responseText);
alert(err.message);
}

0

Ich habe das benutzt und es hat perfekt funktioniert.

error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}

Der xhr.responseText gibt {error: "error in ....."} zurück. Dann verwende ich JSON.parse, um JSON zu analysieren. versuchen Sie es.
Juan Silupú Maza

Bearbeiten Sie die Antwort, wenn Sie etwas hinzufügen möchten. Kommentare sind vorübergehend und Fragen / Antworten sind dauerhafter.
Ejderuby

-1

Wenn Sie keinen Netzwerkfehler haben und einen Fehler aus dem Backend anzeigen möchten, z. B. unzureichende Berechtigungen, senden Sie Ihre Antwort mit einer 200 und einer Fehlermeldung. Überprüfen Sie dann in Ihrem Erfolgshandler data.status == 'error'


1
Warum mit 200 auftauchen? 200 ist OK Status. Er sollte einen Fehlerstatus mit einer benutzerdefinierten Nachricht zurückgeben.
Dementic

Die meisten von mir verwendeten APIs geben tatsächlich eine 200 mit einem Fehlercode im Antworttext zurück.
Chovy

Die Rückgabe von etwas anderem als 200 kann problematisch sein, wenn Sie einen Fehlercode oder eine Fehlermeldung aus dem Backend anzeigen möchten. Nicht-200 wird normalerweise verwendet, um anzuzeigen, dass die Anforderung selbst aus Netzwerkgründen fehlgeschlagen ist ... nicht, dass der Benutzer beispielsweise keine Berechtigung hat. In unserer App verwenden wir Versprechen in unserem "MakeAPICall", das in einer 200-Antwort nach einem Fehlercode sucht und die failMethode anstelle der doneMethode auslöst . Alle Anforderungen geben ein Objekt zurück, das ein 'Status'-Objekt mit Code und Nachricht enthält.
Chovy

1
en.wikipedia.org/wiki/HTTP_403 für die Erlaubnis. Weitere interessante Informationen finden
Sie

403 ist eine ziemlich einfache Interpretation ... und Sie können keinen Antworttext senden. Meine Erlaubnis war nur ein Beispiel. Es gibt Fehlercodes, die ich auftauchen möchte und die app-spezifisch sind. HTTP-Codes umfassen nicht alle diese.
Chovy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.