Як отримати текст відповіді на помилку 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 ! ");
    }
});

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

журнал:

 [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. У випадку з ОП, відповідь навіть не 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


51

Подивіться на responseTextвластивість параметра запиту.


У мене є проблема "парсер" в 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?
chovy


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

Я не отримав номер рядка, але "попередження (помилка)" дав мені "Не знайдено", коли я зателефонував у $ .get, щоб прочитати файл, який був мені потрібний. На xhr.responseText повернулась сторінка 404, яка повідомила, що файл не існує.
Джеймс Тумі

Привіт Джеймсе, якщо його кинути помилку "Не знайдено", це означає, що не вдалося знайти метод "Url" або "Action".
Karthikeyan P


0

Я цим користувався, і це справно працювало.

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

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

Відредагуйте відповідь, якщо хочете до неї щось додати. Коментарі тимчасові, а питання / відповіді більш постійні.
ejderuby

-1

Якщо у вас не виникає мережевої помилки та ви хочете виправити помилку з допоміжного сервісу, щоб використати недостатньо привілеїв, сервер відповість 200 та повідомленням про помилку. Тоді у своєму обробці успіху перевіряйте data.status == 'помилка'


1
Чому поверхня з 200? 200 - це нормально. Він повинен повернути статус помилки за допомогою спеціального повідомлення.
Дементік

Більшість apis, який я використовую, фактично повертає 200 з кодом помилки всередині органу відповіді.
chovy

повернення чогось іншого, ніж 200, може бути проблематичним, коли ви хочете виявити код помилки або повідомлення про помилку з бекенда. не-200 зазвичай використовується для вказівки на те, що сам запит не вдався через мережеві причини ... не те, що користувач не має дозволу, наприклад. У нашому додатку ми використовуємо обіцянки у нашому "MakeAPICall", який шукає код помилки у відповіді 200 та запускає failметод замість doneметоду. Усі запити повертають об’єкт, що містить об’єкт "статус" з кодом та повідомленням.
chovy

1
en.wikipedia.org/wiki/HTTP_403 для дозволу. деякі більш цікаво читати тут stackoverflow.com/questions/7996569 / ...
Dementic

403 є досить базовою інтерпретацією ... і ви не можете надіслати орган відповіді. Мій дозвіл був лише прикладом. Існують коди помилок, які я хочу отримати на поверхні, які залежать від програми. HTTP-коди не охоплюють всього цього.
chovy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.