Jak uzyskać tekst odpowiedzi na błąd jQuery $ .ajax?


234

Wysyłam odpowiedź błędu do mojego jQuery. Jednak nie mogę uzyskać tekstu odpowiedzi (w poniższym przykładzie byłoby to Gone to the beach )

Jedyne, co mówi jQuery, to „błąd”.

Zobacz ten przykład, aby uzyskać szczegółowe informacje:

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

Teraz mój wynik to:

log:

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

alarm:

Nie można tego zrobić, ponieważ: błąd

Jakieś pomysły?


Problem wydaje się być w twoim kodzie php. Czy nie potrzebujesz 2 podziałów między nagłówkami a tekstem? Czy headerfunkcja to obsługuje?
rfunduk

thenduks: PHP wie, co robi. Problem polega na tym, że ponieważ zwracany status HTTP to 500, $.ajax()wywołuje przekazaną mu funkcję błędu.
Chris Charabaruk

Odpowiedzi:


309

Próbować:

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

127
Wolę używać JSON.parse (xhr.responseText)
Phil-R


19
Korzystanie z evaltutaj nie ma większego sensu. Jeśli chcesz przeanalizować odpowiedź JSON, użyj JSON.parse. W przypadku OP odpowiedź nie jest nawet JSON ani JavaScript, więc evalpo prostu spowoduje błąd SyntaxError.
Mark Amery

1
JSON.parse wymaga IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Jeśli wymagana jest obsługa starszych przeglądarek, użyj $ .parseJSON (z jQuery, api.jquery.com/jQuery.parseJSON )
Julian

1
nie zmienia faktu, że nie xhrjest zdefiniowany
phil294

53

Dla mnie to po prostu działa:

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

51

Spójrz na responseTextwłaściwość parametru żądania.


Mam problem „parsererror” w IE8, ale działa w IE7 dla żądania JSONP z różnych źródeł. Ale gdzie jest właściwość responseText? Nigdzie go nie widzę podczas sprawdzania obiektu odpowiedzi podczas debugowania. Widzę tylko readyState, status, statusText i inne metody obiektu żądania $ .ajax ().
NLV,

Obiekt xhr powinien mieć albo responseText lub responseXML w zależności od typu MIME odpowiedzi.
tvanfosson,

Znalazłem problem. W rzeczywistości jquery podczas tworzenia żądania JSONP w ogóle nie tworzy obiektu XHR. JSON-Padding polega na tym, że dodawane są dynamiczne odwołania do skryptów wskazujące na adres URL, a dane json zostaną opakowane metodą, która zostanie wywołana. Tak więc XHR w ogóle nie jest używany.
NLV

Masz problem z IE8 i cross-origin. . Spędziliśmy cały dzień dzisiaj :( stackoverflow.com/questions/8165557/...
NLV

jak parsujesz repsponseText w obiekcie json?
chovy


7

To działało dla mnie

    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 jest również dostępny. Możemy więc uniknąć $ .parseJSON (xhr.responseText)
Prasanth

4

Pozwoli ci to zobaczyć całą odpowiedź, a nie tylko wartość „responseText”

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

3

możesz też spróbować:

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

3

Jeśli chcesz otrzymać błąd składni z numerem linii, użyj tego

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

Nie dostałem numeru linii, ale „alert (błąd)” dał mi komunikat „Nie znaleziono”, gdy zadzwoniłem do $ .get, aby odczytać plik, czego potrzebowałem. Xhr.responseText zwrócił stronę 404 informującą, że plik nie istnieje.
James Toomey,

Cześć James, jeśli wyrzuci błąd „Nie znaleziono”, co oznacza, że ​​nie można znaleźć metody „Url” lub „Action”.
Karthikeyan P

3

Najlepsze proste podejście:

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

0

Użyłem tego i działało idealnie.

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

xhr.responseText return {error: "error in ....."}. następnie używam JSON.parse do analizy JSON. spróbuj użyć.
Juan Silupú Maza

Edytuj odpowiedź, jeśli chcesz coś do niej dodać. Komentarze są tymczasowe, a pytania / odpowiedzi są bardziej trwałe.
ejderuby

-1

Jeśli nie masz błędu sieci i chcesz ujawnić błąd z zaplecza, na przykład niewystarczające uprawnienia, podaj odpowiedź 200 z komunikatem o błędzie. Następnie w module obsługi sukcesu sprawdź data.status == 'error'


1
Dlaczego powierzchnia z 200? 200 ma status OK. Powinien zwrócić status błędu z niestandardowym komunikatem.
Demencja

większość apis, których używam, faktycznie zwraca 200 z kodem błędu w treści odpowiedzi.
chovy

zwracanie czegoś innego niż 200 może być problematyczne, gdy chcesz wyświetlić kod błędu lub komunikat o błędzie z wewnętrznej bazy danych. Non-200 jest zwykle używany do wskazania, że ​​samo żądanie nie powiodło się z powodów sieciowych ... nie dlatego, że użytkownik nie ma na przykład pozwolenia. W naszej aplikacji używamy obietnic w naszym „MakeAPICall”, który szuka kodu błędu w odpowiedzi 200 i uruchamia failmetodę zamiast donemetody. Wszystkie żądania zwracają obiekt zawierający obiekt „status” z kodem i komunikatem.
chovy,

1
en.wikipedia.org/wiki/HTTP_403 o pozwolenie. kilka bardziej interesujących przeczytaj tutaj stackoverflow.com/questions/7996569/…
Dementic

403 jest dość podstawową interpretacją ... i nie możesz wysłać odpowiedzi. Moje pozwolenie było tylko przykładem. Istnieją kody błędów, które chcę ujawnić, które są specyficzne dla aplikacji. Kody HTTP nie obejmują wszystkich z nich.
chovy,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.