Как получить текст ответа об ошибке jQuery $ .ajax?


234

Я отправляю сообщение об ошибке на мой jQuery. Тем не менее, я не могу получить текст ответа (в приведенном ниже примере это будет Ушел на пляж )

Единственное, что говорит jQuery - это «ошибка».

Смотрите этот пример для деталей:

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

Теперь мой результат:

журнал:

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

предупреждение:

Не могу сделать, потому что: ошибка

Любые идеи?


Проблема, кажется, в вашем php-коде. Разве вам не нужны 2 разрывы строки между заголовками и основным текстом? Имеет ли headerручка функция этого?
— rfunduk

thenduks: PHP знает, что делает. Проблема состоит в том, что, поскольку HTTP-статус, возвращающийся 500, $.ajax()вызывает функцию ошибки, переданную ему.
— Крис Чарабарук

Ответы:


309

Пытаться:

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

127
Я предпочитаю использовать JSON.parse (xhr.responseText)
— Phil-R


19
Использование evalздесь не имеет особого смысла. Если вы хотите проанализировать ответ JSON, используйте JSON.parse. В случае с OP ответом даже не является JSON или JavaScript, поэтому вы evalпросто вызовете SyntaxError.
— Марк Амери

1
JSON.parse требует IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Если требуется поддержка старых браузеров, используйте $ .parseJSON (из jQuery, api.jquery.com/jQuery.parseJSON )
— Julian

1
не меняет того факта, что xhrне определено
— phil294

53

Для меня это просто работает:

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

51

Посмотрите на responseTextсвойство параметра запроса.


У меня проблема 'parsererror' в IE8, но я работаю в IE7 для перекрестного запроса JSONP. Но где же свойство responseText? Я не вижу его нигде при проверке объекта ответа во время отладки. Я вижу только readyState, status, statusText и другие методы объекта запроса $ .ajax ().
— NLV

У xhr-объекта должен быть responseText или responseXML в зависимости от типа MIME ответа.
— tvanfosson

Я нашел проблему. В действительности, jquery при создании запроса JSONP вообще не создает объект XHR. JSON-Padding - это просто динамические ссылки на скрипты, указывающие на URL, а данные json будут заключены в метод, который вызывается. Так что XHR вообще не используется.
— NLV

Есть проблема с IE8 и перекрестного происхождения. Сегодня провел целый день :(. Stackoverflow.com/questions/8165557/…
— NLV

Как вы анализируете repsponseText в объект JSON?
— Чови


7

Это то, что сработало для меня

    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 также доступен. Таким образом , мы можем избежать $ .parseJSON (xhr.responseText)
— Prasanth

4

Это позволит вам увидеть весь ответ, а не только значение responseText

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

3

Вы можете попробовать это тоже:

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

3

Если вы хотите получить синтаксическую ошибку с номером строки, используйте эту

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

Я не получил номер строки, но «alert (error)» действительно дал мне «Not Found», когда я позвонил в $ .get, чтобы прочитать файл, и это было то, что мне было нужно. Xhr.responseText вернул страницу 404, сообщающую, что файл не существует.
— Джеймс Туми

Привет, Джеймс, если выдает ошибку «Not Found», это означает, что не удается найти метод «Url» или «Action».
— Картикеян П,

3

Лучший простой подход:

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

0

Я использовал это, и это сработало отлично.

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

xhr.responseText возвращает {error: "error in ....."}. затем я использую JSON.parse для анализа JSON. попробуй использовать.
— Хуан Силупу Маза

Отредактируйте ответ, если хотите что-то добавить к нему. Комментарии являются временными, а вопросы / ответы более постоянными.
— ejderuby

-1

Если у вас нет сетевой ошибки и вы хотите обнаружить ошибку из бэкэнда, например, из-за недостаточных привилегий, отправьте в ответ на ваш запрос 200 и сообщение об ошибке. Затем в вашем обработчике успеха проверьте data.status == 'error'


1
Почему поверхность с 200? 200 в порядке. Он должен вернуть статус ошибки с пользовательским сообщением.
— Дементик

большинство API, которые я использую, на самом деле возвращают 200 с кодом ошибки внутри тела ответа.
— Чови

Возврат чего-то отличного от 200 может быть проблематичным, если вы хотите вспомнить код ошибки или сообщение об ошибке из серверной части. non-200 обычно используется для указания того, что сам запрос не выполнен по сетевым причинам ... не то, что у пользователя нет разрешения, например. В нашем приложении мы используем обещания в нашем «MakeAPICall», который ищет код ошибки в ответе 200 и запускает failметод вместо doneметода. Все запросы возвращают объект, который содержит объект «status» с кодом и сообщением.
— Чови

1
en.wikipedia.org/wiki/HTTP_403 для разрешения. еще немного интересного читайте здесь stackoverflow.com/questions/7996569/…
— Dementic

403 - довольно простая интерпретация ... и вы не можете отправить ответное тело. Мое разрешение было только примером. Есть коды ошибок, которые я хочу вспомнить, которые зависят от приложения. HTTP-коды не охватывают все это.
— Чови
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.