Como obter o texto de resposta de erro do jQuery $ .ajax?

234

Estou enviando uma resposta de erro ao meu jQuery. No entanto, não consigo obter o texto da resposta (no exemplo abaixo, este foi para a praia )

A única coisa que o jQuery diz é 'erro'.

Veja este exemplo para detalhes:

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

Agora meu resultado é:

registro:

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

alerta:

Não é possível fazer porque: erro

Alguma ideia?

jantimon
fonte
O problema parece estar no seu código php. Você não precisa de duas quebras de linha entre os cabeçalhos e o texto do corpo? A headerfunção lida com isso?
Rfunduk 28/10/09
thenduks: PHP sabe o que está fazendo. O problema é que, como o status HTTP retornado é 500, $.ajax()chama a função de erro passada para ele.
22430 Chris Charabaruk

Respostas:

309

Experimentar:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");
  alert(err.Message);
}
Alex Bagnolini
fonte
127
Eu prefiro usar JSON.parse (xhr.responseText)
Phil-R
68
evalé EVIL ... stackoverflow.com/questions/646597/…
Latorre alemão
19
Usar um evalaqui não faz muito sentido. Se você deseja analisar uma resposta JSON, use JSON.parse. No caso do OP, a resposta não é nem JSON ou JavaScript; portanto, você evalcausará um SyntaxError.
Mark27 Aug14
1
JSON.parse precisa do IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Se for necessário suporte para navegadores mais antigos, use $ .parseJSON (de jQuery, api.jquery.com/jQuery.parseJSON )
Julian
1
não muda o fato de que xhré indefinido
phil294
53

Para mim, isso simplesmente funciona:

error: function(xhr, status, error) {
  alert(xhr.responseText);
}
HaoQi Li
fonte
51

Veja a responseTextpropriedade do parâmetro request.

tvanfosson
fonte
Eu tenho um problema 'parsererror' no IE8, mas estou trabalhando no IE7 para solicitação JSONP de origem cruzada. Mas onde está a propriedade responseText? Não o vejo em nenhum lugar enquanto verifica o objeto de resposta durante a depuração. Eu vejo apenas readyState, status, statusText e os outros métodos do objeto de solicitação $ .ajax ().
NLV
O objeto xhr deve ter responseText ou responseXML, dependendo do tipo MIME da resposta.
Tvanfosson 17/11
Eu encontrei o problema Na realidade, o jquery ao criar uma solicitação JSONP não criará nenhum objeto XHR. JSON-Padding é apenas que referências de script dinâmicas são adicionadas apontando para a URL e os dados do json serão agrupados com um método que é chamado. Portanto, o XHR não é usado.
NLV
Tem um problema com o IE8 e com origem cruzada. Passei o dia inteiro hoje :(. Stackoverflow.com/questions/8165557/…
NLV
como você analisa repsponseText em um objeto json?
Chovy
15

Como sugerido por essa outra resposta e pelos comentários nesta página:

error: function(xhr, status, error) {
  var err = JSON.parse(xhr.responseText);
  alert(err.Message);
}
Brad Parks
fonte
7

Isto é o que funcionou para mim

    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
fonte
2
xhr.responseJSON também está disponível. Assim, podemos evitar $ .parseJSON (xhr.responseText)
Prasanth
4

Isso permitirá que você veja toda a resposta, não apenas o valor "responseText"

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

você pode tentar também:

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

Se você deseja obter o erro de sintaxe com o número da linha, use este

error: function(xhr, status, error) {
  alert(error);
}
Karthikeyan P
fonte
Não recebi um número de linha, mas "alert (error)" me deu um "Not Found" quando liguei para $ .get para ler um arquivo, que era o que eu precisava. O xhr.responseText retornou uma página 404 informando que o arquivo não existia.
James Toomey
Olá James, se for lançado o erro "Não encontrado", que significa incapaz de encontrar o método "Url" ou "Ação".
Karthikeyan P
3

A melhor abordagem simples:

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

Eu usei isso, e funcionou perfeitamente.

error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}
Juan Silupú Maza
fonte
o xhr.responseText retorna {error: "error in ....."}. então, iam use JSON.parse para analisar JSON. tente usar.
Juan Silupú Maza 15/08/19
Edite a resposta se desejar adicionar algo a ela. Os comentários são temporários e as perguntas / respostas são mais permanentes.
ejderuby
-1

Se você não está tendo um erro de rede e deseja exibir um erro do back-end, por exemplo, privilégios insuficientes, servidor sua resposta com 200 e uma mensagem de erro. Em seguida, no seu manipulador de sucesso, verifique data.status == 'erro'

chovy
fonte
1
Por que superfície com 200? 200 está no status OK. Ele deve retornar um status de erro com uma mensagem personalizada.
Dementic
a maioria das APIs que eu uso realmente retorna um 200 com um código de erro dentro do corpo da resposta.
Chovy
retornar algo diferente de 200 pode ser problemático quando você deseja exibir um código de erro ou uma mensagem de erro do back-end. non-200 é geralmente usado para indicar que a solicitação em si falhou devido a razões de rede ... não que o usuário não tenha permissão, por exemplo. Em nosso aplicativo, usamos promessas em nosso "MakeAPICall", que procura um código de erro em uma resposta 200 e aciona o failmétodo em vez do donemétodo. Todas as solicitações retornam um objeto que contém um objeto 'status' com código e mensagem.
chovy
1
pt.wikipedia.org/wiki/HTTP_403 para obter a permissão. um pouco mais interessante, leia aqui stackoverflow.com/questions/7996569/…
Dementic
403 é uma interpretação bastante básica ... e você não pode enviar um corpo de resposta. Minha permissão foi apenas um exemplo. Existem códigos de erro que quero que sejam específicos do aplicativo. Os códigos HTTP não abrangem todos esses.
Chovy