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?

jimon
sumber
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);
}
Alex Bagnolini
sumber
127
Saya lebih suka menggunakan JSON.parse (xhr.responseText)
Phil-R
68
evalis EVIL ... stackoverflow.com/questions/646597/…
German Latorre
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);
}
HaoQi Li
sumber
51

Lihatlah responseTextproperti dari parameter permintaan.

tvanfosson
sumber
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
15

Seperti yang akhirnya disarankan oleh jawaban lain ini dan komentar di halaman ini:

error: function(xhr, status, error) {
  var err = JSON.parse(xhr.responseText);
  alert(err.Message);
}
Taman Brad
sumber
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);
        }
    }
pengguna3255682
sumber
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));
}
Kareem
sumber
3

Anda dapat mencobanya juga:

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

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

error: function(xhr, status, error) {
  alert(error);
}
Karthikeyan P
sumber
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);
}
Mazen Embaby
sumber
0

Saya menggunakan ini, dan itu bekerja dengan sempurna.

error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}
Juan Silupú Maza
sumber
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'

kenyal
sumber
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