Comment obtenir le texte de réponse d'erreur jQuery $ .ajax?


234

J'envoie une réponse d'erreur à ma jQuery. Cependant, je ne peux pas obtenir le texte de réponse (dans l'exemple ci-dessous, ce serait allé à la plage )

La seule chose que jQuery dit est «erreur».

Voir cet exemple pour plus de détails:

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

Maintenant mon résultat est:

Journal:

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

alerte:

Impossible à faire car: erreur

Des idées?


Le problème semble être dans votre code php. Vous n'avez pas besoin de 2 sauts de ligne entre les en-têtes et le corps du texte? La headerfonction gère-t-elle cela?
rfunduk

thenduks: PHP sait ce qu'il fait. Le problème est que, le statut HTTP revenant étant 500, $.ajax()appelle la fonction d'erreur qui lui est transmise.
Chris Charabaruk

Réponses:


309

Essayer:

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

127
Je préfère utiliser JSON.parse (xhr.responseText)
Phil-R


19
Utiliser un evalici n'a pas beaucoup de sens. Si vous souhaitez analyser une réponse JSON, utilisez JSON.parse. Dans le cas de l'OP, la réponse n'est même pas JSON ou JavaScript, donc votre evalva juste provoquer une SyntaxError.
Mark Amery

1
JSON.parse a besoin d'IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Si le support pour les anciens navigateurs est nécessaire, utilisez .parseJSON $ (de jQuery, api.jquery.com/jQuery.parseJSON )
Julian

1
ne change pas le fait qui xhrn'est pas défini
phil294

53

Pour moi, cela fonctionne simplement:

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

51

Regardez la responseTextpropriété du paramètre de demande.


J'ai un problème de "parsererror" dans IE8 mais je travaille dans IE7 pour une requête JSONP d'origine croisée. Mais où est la propriété responseText? Je ne le vois nulle part lors de la vérification de l'objet de réponse lors du débogage. Je ne vois que readyState, status, statusText et les autres méthodes de l'objet de requête $ .ajax ().
NLV

L'objet xhr doit avoir responseText ou responseXML selon le type MIME de la réponse.
tvanfosson

J'ai trouvé le problème. En réalité, jquery lors de la création d'une requête JSONP ne créera pas du tout d'objet XHR. JSON-Padding est simplement que des références de script dynamiques sont ajoutées pointant vers l'URL et les données json seront enveloppées avec une méthode qui sera invoquée. XHR n'est donc pas du tout utilisé.
NLV

Vous avez un problème avec IE8 et l'origine croisée. Passé toute la journée aujourd'hui :(. Stackoverflow.com/questions/8165557/…
NLV

comment analysez-vous repsponseText dans un objet json?
chovy


7

C'est ce qui a fonctionné pour moi

    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 est également disponible. Nous pouvons donc éviter $ .parseJSON (xhr.responseText)
Prasanth

4

Cela vous permettra de voir la réponse entière et pas seulement la valeur "responseText"

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

3

vous pouvez aussi l'essayer:

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

3

Si vous voulez obtenir une erreur de syntaxe avec le numéro de ligne, utilisez ceci

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

Je n'ai pas obtenu de numéro de ligne, mais "alerte (erreur)" m'a donné un "Introuvable" lorsque j'ai appelé $ .get pour lire un fichier, ce dont j'avais besoin. Le xhr.responseText a renvoyé une page 404 me disant que le fichier n'existait pas.
James Toomey

Salut James, si son lancer l'erreur "Not Found" qui signifie impossible de trouver la méthode "Url" ou "Action".
Karthikeyan P

3

La meilleure approche simple:

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

0

Je l'ai utilisé et cela a parfaitement fonctionné.

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

le xhr.responseText renvoie {error: "error in ....."}. puis, j'utilise JSON.parse pour analyser JSON. essayez d'utiliser.
Juan Silupú Maza

Modifiez la réponse si vous souhaitez y ajouter quelque chose. Les commentaires sont temporaires et les questions / réponses sont plus permanentes.
ejderuby

-1

Si vous ne rencontrez pas d'erreur de réseau et que vous souhaitez faire apparaître une erreur depuis le backend, pour des privilèges par exemple insuffisants, envoyez votre réponse avec un 200 et un message d'erreur. Ensuite, dans votre gestionnaire de réussite, vérifiez data.status == 'error'


1
Pourquoi faire surface avec 200? 200 est l'état OK. Il doit renvoyer un état d'erreur avec un message personnalisé.
Dementic

la plupart des API que j'utilise retournent en fait un 200 avec un code d'erreur dans le corps de la réponse.
chovy

renvoyer quelque chose d'autre que 200 peut être problématique lorsque vous souhaitez faire apparaître un code d'erreur ou un message d'erreur à partir du backend. non-200 est généralement utilisé pour indiquer que la demande elle-même a échoué pour des raisons de réseau ... pas que l'utilisateur n'a pas l'autorisation par exemple. Dans notre application, nous utilisons des promesses dans notre "MakeAPICall" qui recherche un code d'erreur dans une réponse 200 et déclenche la failméthode au lieu de la doneméthode. Toutes les demandes renvoient un objet qui contient un objet «status» avec du code et un message.
chovy

1
en.wikipedia.org/wiki/HTTP_403 pour la permission. certains plus intéressants lire ici stackoverflow.com/questions/7996569/…
Dementic

403 est une interprétation assez basique ... et vous ne pouvez pas envoyer de corps de réponse. Ma permission n'était qu'un exemple. Il y a des codes d'erreur que je veux faire apparaître qui sont spécifiques à l'application. Les codes HTTP ne les englobent pas tous.
chovy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.