Bagaimana cara mendapatkan teks respons kesalahan jQuery $ .ajax?


234

Saya mengirim respons kesalahan ke jQuery saya. Namun, saya tidak bisa mendapatkan teks respons (dalam contoh di bawah ini akan Hilang ke pantai )

Satu-satunya hal yang dikatakan jQuery adalah 'kesalahan'.

Lihat contoh ini untuk detail:

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

Sekarang hasil saya adalah:

catatan:

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

waspada:

Tidak dapat melakukannya karena: kesalahan

Ada ide?


Masalahnya muncul di kode php Anda. Tidakkah Anda membutuhkan 2 linebreak antara header dan teks isi? Apakah headerfungsinya menangani ini?
rfunduk

thenduks: PHP tahu apa yang dilakukannya. Masalahnya adalah karena status HTTP yang kembali adalah 500, $.ajax()panggilan fungsi kesalahan diteruskan ke sana.
Chris Charabaruk

Jawaban:


309

Mencoba:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");
  alert(err.Message);
}

127
Saya lebih suka menggunakan JSON.parse (xhr.responseText)
Phil-R


19
Menggunakan di evalsini tidak masuk akal. Jika Anda ingin mem-parsing respons JSON, gunakan JSON.parse. Dalam kasus OP, responsnya bahkan bukan JSON atau JavaScript, jadi Anda evalhanya akan menyebabkan SyntaxError.
Mark Amery

1
JSON.parse membutuhkan IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Jika diperlukan dukungan untuk peramban yang lebih lama, gunakan $ .parseJSON (dari jQuery, api.jquery.com/jQuery.parseJSON )
Julian

1
tidak mengubah fakta yang xhrtidak terdefinisi
phil294

53

Bagi saya, ini hanya bekerja:

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

51

Lihatlah responseTextproperti dari parameter permintaan.


Saya memiliki masalah 'parsererror' di IE8 tetapi bekerja di IE7 untuk permintaan JSONP lintas-asal. Tapi di mana properti responseText? Saya tidak melihatnya di mana pun saat memeriksa objek respons selama debugging. Saya hanya melihat readyState, status, statusText dan metode lain dari objek permintaan $ .ajax ().
NLV

Objek xhr harus memiliki responseText atau responseXML tergantung pada tipe respons MIME.
tvanfosson

Saya menemukan masalahnya. Pada kenyataannya jquery saat membuat permintaan JSONP tidak akan membuat objek XHR sama sekali. JSON-Padding hanya bahwa referensi skrip dinamis ditambahkan menunjuk ke URL dan data json akan dibungkus dengan metode yang dipanggil. Jadi XHR tidak digunakan sama sekali.
NLV

Memiliki masalah dengan IE8 dan asal-usul silang. Menghabiskan sepanjang hari hari ini :(. Stackoverflow.com/questions/8165557/…
NLV

bagaimana Anda menguraikan repsponseText menjadi objek json?
chovy


7

Inilah yang bekerja untuk saya

    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 juga tersedia. Jadi kita dapat menghindari $ .parseJSON (xhr.responseText)
Prasanth

4

Ini akan memungkinkan Anda untuk melihat seluruh respons, bukan hanya nilai "responseText"

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

3

Anda dapat mencobanya juga:

$(document).ajaxError(
    function (event, jqXHR, ajaxSettings, thrownError) {
        alert('[event:' + event + '], [jqXHR:' + jqXHR + '], [ajaxSettings:' + ajaxSettings + '], [thrownError:' + thrownError + '])');
    });

3

Jika Anda ingin mendapatkan Kesalahan Sintaks dengan nomor baris, gunakan ini

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

Saya tidak mendapatkan nomor baris, tetapi "peringatan (kesalahan)" memberi saya "Tidak Ditemukan" ketika saya menelepon $. Dapatkan untuk membaca file, itulah yang saya butuhkan. Xhr.responseText mengembalikan halaman 404 yang memberitahu saya file itu tidak ada.
James Toomey

Hai James, jika melemparkan kesalahan "Tidak Ditemukan" yang berarti tidak dapat menemukan metode "Url" atau "Tindakan".
Karthikeyan P

3

Pendekatan sederhana terbaik:

error: function (xhr) {
var err = JSON.parse(xhr.responseText);
alert(err.message);
}

0

Saya menggunakan ini, dan itu bekerja dengan sempurna.

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

the xhr.responseText mengembalikan {error: "error in ....."}. kemudian, saya menggunakan JSON.parse untuk parse JSON. coba gunakan.
Juan Silupú Maza

Edit jawabannya jika Anda ingin menambahkan sesuatu ke dalamnya. Komentar bersifat sementara, dan pertanyaan / jawaban lebih permanen.
ejderuby

-1

Jika Anda tidak memiliki kesalahan jaringan, dan ingin memunculkan kesalahan dari backend, untuk hak istimewa yang tidak mencukupi, server respons Anda dengan 200 dan pesan kesalahan. Kemudian di handler sukses Anda periksa data.status == 'kesalahan'


1
Kenapa muncul dengan 200? 200 adalah status OK. Ia harus mengembalikan status kesalahan dengan pesan khusus.
Demensik,

kebanyakan apis yang saya gunakan sebenarnya mengembalikan 200 dengan kode kesalahan di dalam tubuh respons.
chovy

mengembalikan sesuatu selain 200 dapat bermasalah ketika Anda ingin memunculkan kode kesalahan atau pesan kesalahan dari backend. non-200 biasanya digunakan untuk menunjukkan bahwa permintaan itu sendiri gagal karena alasan jaringan ... bukan karena pengguna tidak memiliki izin misalnya. Di aplikasi kami, kami menggunakan janji di "MakeAPICall" kami yang mencari kode kesalahan dalam respons 200 dan menjalankan failmetode alih-alih donemetode. Semua permintaan mengembalikan objek yang berisi objek 'status' dengan kode dan pesan.
chovy

1
en.wikipedia.org/wiki/HTTP_403 untuk izin. beberapa lebih menarik baca di sini stackoverflow.com/questions/7996569/…
Dementic

403 adalah interpretasi yang cukup mendasar ... dan Anda tidak dapat mengirim badan tanggapan. Izin saya hanyalah contoh. Ada kode kesalahan yang ingin saya permukaankan yang khusus untuk aplikasi. Kode HTTP tidak mencakup semua ini.
chovy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.