JQuery $ .ajax hata yanıt metni nasıl alınır?


234

Benim jQuery bir hata yanıtı gönderiyorum. Ancak, yanıt metnini alamıyorum (aşağıdaki örnekte bu sahile giderdi )

JQuery'nin söylediği tek şey 'hata'dır.

Ayrıntılar için bu örneğe bakın:

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

Şimdi benim sonucum ist:

log:

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

uyarmak:

Yapamam çünkü: hata

Herhangi bir fikir?


Sorun php kodunuzda gibi görünüyor. Üstbilgiler ve gövde metni arasında 2 satır aralığına ihtiyacınız yok mu? Does headerfonksiyon bu işi?
rfunduk

thenduks: PHP ne yaptığını biliyor. Sorun, geri gelen HTTP durumu 500 olduğundan, $.ajax()kendisine iletilen hata işlevini çağırır.
Chris Charabaruk

Yanıtlar:


309

Deneyin:

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

127
JSON.parse (xhr.responseText)
Phil-R


19
evalBurada kullanmak pek mantıklı değil. Bir JSON yanıtını ayrıştırmak istiyorsanız, kullanın JSON.parse. OP durumunda, yanıt JSON veya JavaScript bile değil, bu yüzden evalsadece bir SyntaxError'a neden olacak.
Mark Amery

1
JSON.parse için IE8 + gerekir. ( developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/… ). Daha eski tarayıcılar için destek gerekiyorsa, $ .parseJSON (jQuery, api.jquery.com/jQuery.parseJSON adresinden ) kullanın
Julian

1
xhrundefined gerçeği değiştirmez
phil294

53

Benim için bu sadece işe yarıyor:

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

51

responseTextRequest parametresinin özelliğine bakın .


IE8 'ayrıştırıcı' bir sorun var ama çapraz kökenli JSONP isteği için IE7 çalışıyor. Ancak responseText özelliği nerede? Hata ayıklama sırasında yanıt nesnesini denetlerken hiçbir yerde görmüyorum. Yalnızca readyState, status, statusText ve $ .ajax () istek nesnesinin diğer yöntemlerini görüyorum.
NLV

Xhr nesnesi, yanıtın MIME türüne bağlı olarak responseText veya responseXML'ye sahip olmalıdır.
tvanfosson

Sorunu buldum. Gerçekte JSONP isteği oluşturulurken jquery XHR nesnesi oluşturmaz. JSON-Padding, URL'ye işaret eden dinamik komut dosyası referanslarının eklenmesi ve json verilerinin çağrılan bir yöntemle sarılmasıdır. Yani XHR hiç kullanılmıyor.
NLV

IE8 ve çapraz kaynakla ilgili bir sorun yaşayın. Bugün bütün gün geçirdim :(. Stackoverflow.com/questions/8165557/…
NLV

repsponseText'i bir json nesnesine nasıl ayrıştırırsınız?
chovy


7

Bu benim için işe yaradı

    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 da mevcuttur. Böylece $ .parseJSON (xhr.responseText)
Prasanth

4

Bu, yalnızca "responseText" değerini değil, tüm yanıtı görmenizi sağlar

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

3

siz de deneyebilirsiniz:

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

3

Satır numarasıyla Sözdizimi Hatası almak istiyorsanız , bunu kullanın

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

Bir satır numarası alamadım, ancak bir dosya okumak için $ .get çağırdığımda "uyarı (hata)" bana bir "Bulunamadı" verdi, bu da ihtiyacım olan şeydi. Xhr.responseText, dosyanın mevcut olmadığını belirten bir 404 sayfası döndürdü.
James Toomey

Merhaba James, atmak "Bulunamadı" hatası anlamına gelir "Url" veya "Eylem" yöntemi bulamıyor demektir.
Karthikeyan P

3

En iyi basit yaklaşım:

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

0

Bunu kullandım ve mükemmel çalıştı.

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

xhr.responseText return {error: "hata ....."} içinde. sonra, ben JSON ayrıştırmak için JSON.parse kullanın. kullanmayı deneyin.
Juan Silupú Maza

Cevaba herhangi bir şey eklemek istiyorsanız cevabı düzenleyin. Yorumlar geçicidir ve sorular / cevaplar daha kalıcıdır.
ejderuby

-1

Bir ağ hatası almıyorsanız ve arka uçta bir hata ortaya çıkarmak istiyorsanız, yetersiz ayrıcalıklar için yanıtınızı 200 ve bir hata mesajı ile sunuculayın. Ardından başarı işleyicinizde data.status == 'hata'


1
Neden 200 ile yüzey? 200, Tamam durumudur. Özel bir mesajla hata durumu döndürmelidir.
Dementic

kullandığım çoğu apis aslında yanıt gövdesi içinde bir hata kodu ile 200 döndürür.
chovy

Arka uçtan bir hata kodu veya hata mesajı vermek istediğinizde 200 dışında bir şey döndürmek sorunlu olabilir. 200 dışı genellikle ağ nedenlerinden dolayı isteğin kendisinin başarısız olduğunu belirtmek için kullanılır ... kullanıcının örneğin izni olmadığını. Bizim app, biz 200 yanıt bir hata kodu arar ve failyöntem yerine yöntemi ateş bizim "MakeAPICall" vaat kullanın done. Tüm istekler, kod ve mesaj içeren bir 'durum' nesnesi içeren bir nesne döndürür.
chovy


403 oldukça basit bir yorumdur ... ve bir yanıt kuruluşu gönderemezsiniz. İznim sadece bir örnekti. Uygulamaya özel olarak ortaya koymak istediğim hata kodları var. HTTP kodları bunların tümünü kapsamaz.
chovy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.