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?

jantimon
la source
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);
}
Alex Bagnolini
la source
127
Je préfère utiliser JSON.parse (xhr.responseText)
Phil-R
68
evalis EVIL ... stackoverflow.com/questions/646597/…
German Latorre
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);
}
HaoQi Li
la source
51

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

tvanfosson
la source
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
15

Comme finalement suggéré par cette autre réponse et ses commentaires sur cette page:

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

vous pouvez aussi l'essayer:

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

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

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

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

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

chovy
la source
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