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

169

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

Единственное, что говорит 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 ! ");
    }
});

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

Журнал:

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

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

Невозможно сделать, потому что: ошибка

Любые идеи?

  • 0
    Проблема, кажется, в вашем php-коде. Разве вам не нужны 2 разрывы строки между заголовками и основным текстом? Функция header обрабатывает это?
  • 0
    thenduks: PHP знает, что делает. Проблема заключается в том, что, поскольку HTTP-статус возвращается 500, $.ajax() вызывает переданную ему функцию ошибки.
Теги:
error-handling

9 ответов

243
Лучший ответ

Try:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");
  alert(err.Message);
}
  • 108
    Я предпочитаю использовать JSON.parse (xhr.responseText)
  • 53
    eval is EVIL ... stackoverflow.com/questions/646597/…
Показать ещё 6 комментариев
47

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

  • 0
    У меня проблема 'parsererror' в IE8, но я работаю в IE7 для перекрестного запроса JSONP. Но где же свойство responseText? Я не вижу его нигде при проверке объекта ответа во время отладки. Я вижу только readyState, status, statusText и другие методы объекта запроса $ .ajax ().
  • 0
    У объекта xhr должен быть либо responseText, либо responseXML, в зависимости от типа ответа MIME.
Показать ещё 3 комментария
35

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

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

Как в конечном итоге предлагается этот другой ответ и он комментирует на этой странице:

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

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

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

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

$(document).ajaxError(
    function (event, jqXHR, ajaxSettings, thrownError) {
        alert('[event:' + event + '], [jqXHR:' + jqXHR + '], [ajaxSettings:' + ajaxSettings + '], [thrownError:' + thrownError + '])');
    });
  • 1
    Это то, что я пытался с console.log(arguments);
2

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

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

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

error: function(xhr, status, error) {
  alert(error);
}
  • 0
    Я не получил номер строки, но «alert (error)» действительно дал мне «Not Found», когда я позвонил в $ .get, чтобы прочитать файл, и это было то, что мне было нужно. Xhr.responseText вернул страницу 404, сообщающую, что файл не существует.
  • 0
    Привет, Джеймс, если выдает ошибку «Not Found», это означает, что не удается найти метод «Url» или «Action».
0

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

  • 1
    Почему поверхность с 200? 200 в порядке. Он должен вернуть статус ошибки с пользовательским сообщением.
  • 0
    большинство API, которые я использую, на самом деле возвращают 200 с кодом ошибки внутри тела ответа.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню