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?

jantimon
quelle
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);
}
Alex Bagnolini
quelle
127
Ich bevorzuge JSON.parse (xhr.responseText)
Phil-R
68
evalis EVIL ... stackoverflow.com/questions/646597/…
Deutscher Latorre
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);
}
HaoQi Li
quelle
51

Sehen Sie sich die responseTextEigenschaft des Anforderungsparameters an.

Tvanfosson
quelle
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
15

Wie letztendlich durch diese andere Antwort und ihre Kommentare auf dieser Seite vorgeschlagen:

error: function(xhr, status, error) {
  var err = JSON.parse(xhr.responseText);
  alert(err.Message);
}
Brad Parks
quelle
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);
        }
    }
user3255682
quelle
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));
}
Kareem
quelle
3

Sie können es auch versuchen:

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

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

error: function(xhr, status, error) {
  alert(error);
}
Karthikeyan P.
quelle
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);
}
Mazen Embaby
quelle
0

Ich habe das benutzt und es hat perfekt funktioniert.

error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}
Juan Silupú Maza
quelle
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'

chovy
quelle
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