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

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

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

Любые идеи?

jantimon
источник
Проблема, кажется, в вашем 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
68
evalЗЛО ... stackoverflow.com/questions/646597/…
немецкий Latorre
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);
}
HaoQi Li
источник
51

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

tvanfosson
источник
У меня проблема '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);
        }
    }
user3255682
источник
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 + '])');
    });
85tisgirjetuji8
источник
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);
}
Mazen Embaby
источник
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'

chovy
источник
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-коды не охватывают все это.
Чови