¿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?


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

127
Prefiero usar JSON.parse (xhr.responseText)
Phil-R


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

51

Mire la responseTextpropiedad del parámetro de solicitud.


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

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

3

puedes probarlo también:

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

3

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

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

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

0

Usé esto, y funcionó perfectamente.

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

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'


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.