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