Как получить текст ответа об ошибке 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.