¿Cómo obtener el texto de respuesta de error jQuery $ .ajax?

234

Estoy enviando una respuesta de error a mi jQuery. Sin embargo, no puedo obtener el texto de respuesta (en el ejemplo a continuación, esto sería Gone to the beach )

Lo único que jQuery dice es 'error'.

Vea este ejemplo para más detalles:

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

Ahora mi resultado es:

Iniciar sesión:

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

alerta:

No se puede hacer porque: error

¿Algunas ideas?

jantimon
fuente
El problema parece estar en su código php. ¿No necesita 2 saltos de línea entre los encabezados y el texto del cuerpo? ¿La headerfunción maneja esto?
rfunduk
thenduks: PHP sabe lo que está haciendo. El problema es que debido a que el estado HTTP que regresa es 500, $.ajax()llama a la función de error que se le pasa.
Chris Charabaruk

Respuestas:

309

Tratar:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");
  alert(err.Message);
}
Alex Bagnolini
fuente
127
Prefiero usar JSON.parse (xhr.responseText)
Phil-R
68
evales EVIL ... stackoverflow.com/questions/646597/…
German Latorre
19
Usar un evalaquí no tiene mucho sentido. Si desea analizar una respuesta JSON, use JSON.parse. En el caso del OP, la respuesta ni siquiera es JSON o JavaScript, por evallo que solo va a causar un SyntaxError.
Mark Amery
1
JSON.parse necesita IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Si se necesita soporte para navegadores antiguos, use $ .parseJSON (de jQuery, api.jquery.com/jQuery.parseJSON )
Julian
1
no cambia el hecho de que xhrno está definido
phil294
53

Para mí, esto simplemente funciona:

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

Mire la responseTextpropiedad del parámetro de solicitud.

tvanfosson
fuente
Tengo un problema de 'parsererror' en IE8 pero estoy trabajando en IE7 para la solicitud JSONP de origen cruzado. Pero, ¿dónde está la propiedad responseText? No lo veo en ninguna parte mientras verifico el objeto de respuesta durante la depuración. Solo veo readyState, status, statusText y los otros métodos del objeto de solicitud $ .ajax ().
NLV
El objeto xhr debe tener responseText o responseXML dependiendo del tipo MIME de la respuesta.
tvanfosson
Encontré el problema. En realidad, jquery al crear una solicitud JSONP no creará ningún objeto XHR. JSON-Padding es solo que se agregan referencias de script dinámico apuntando a la URL y los datos json se envolverán con un método que se invoca. Entonces XHR no se usa en absoluto.
NLV
Tiene un problema con IE8 y origen cruzado. . :( pasado hoy día entero stackoverflow.com/questions/8165557/...
NLV
¿Cómo se analiza repsponseText en un objeto json?
Chovy
7

Esto es lo que funcionó para mí.

    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);
        }
    }
usuario3255682
fuente
2
xhr.responseJSON también está disponible. Entonces podemos evitar $ .parseJSON (xhr.responseText)
Prasanth
4

Esto le permitirá ver la respuesta completa, no solo el valor "responseText"

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

puedes probarlo también:

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

Si desea obtener un error de sintaxis con el número de línea, use esto

error: function(xhr, status, error) {
  alert(error);
}
Karthikeyan P
fuente
No obtuve un número de línea, pero "alerta (error)" me dio un "No encontrado" cuando llamé a $ .get para leer un archivo, que era lo que necesitaba. El xhr.responseText devolvió una página 404 diciéndome que el archivo no existía.
James Toomey
Hola James, si arroja el error "No encontrado", eso significa que no puede encontrar el método "Url" o "Acción".
Karthikeyan P
3

El mejor enfoque simple:

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

Usé esto, y funcionó perfectamente.

error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}
Juan Silupú Maza
fuente
xhr.responseText return {error: "error en ....."}. luego, iam usa JSON.parse para analizar JSON. intente usar.
Juan Silupú Maza
Edite la respuesta si desea agregarle algo. Los comentarios son temporales y las preguntas / respuestas son más permanentes.
ejderuby
-1

Si no tiene un error de red y desea mostrar un error desde el servidor, por ejemplo, privilegios insuficientes, responda al servidor con un 200 y un mensaje de error. Luego, en su controlador de éxito, verifique data.status == 'error'

chovy
fuente
1
¿Por qué salir a la superficie con 200? 200 es el estado correcto. Debería devolver un estado de error con un mensaje personalizado.
Demencia el
La mayoría de las API que uso en realidad devuelven un 200 con un código de error dentro del cuerpo de la respuesta.
chovy
devolver algo que no sea 200 puede ser problemático cuando desea mostrar un código de error o mensaje de error desde el backend. el no 200 se usa generalmente para indicar que la solicitud en sí falló debido a razones de red ... no es que el usuario no tenga permiso, por ejemplo. En nuestra aplicación, utilizamos promesas en nuestro "MakeAPICall" que busca un código de error en una respuesta 200 y activa el failmétodo en lugar del donemétodo. Todas las solicitudes devuelven un objeto que contiene un objeto de 'estado' con código y mensaje.
chovy
1
en.wikipedia.org/wiki/HTTP_403 para el permiso. algo más interesante, lea aquí stackoverflow.com/questions/7996569/…
Dementic el
403 es una interpretación bastante básica ... y no puede enviar un cuerpo de respuesta. Mi permiso fue solo un ejemplo. Hay códigos de error que quiero mostrar que son específicos de la aplicación. Los códigos HTTP no abarcan todos estos.
chovy