วิธีรับข้อความตอบกลับข้อผิดพลาด 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 ! ");
    }
});

ตอนนี้ผลของฉันคือ:

เข้าสู่ระบบ:

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

การแจ้งเตือน:

ไม่สามารถทำได้เพราะ: เกิดข้อผิดพลาด

ความคิดใด ๆ


ปัญหาดูเหมือนจะอยู่ในรหัส php ของคุณ คุณไม่ต้องการการแบ่งบรรทัด 2 บรรทัดระหว่างส่วนหัวและเนื้อความใช่หรือไม่ ที่ไม่headerฟังก์ชั่นการจัดการนี้
rfunduk

thenduks: PHP รู้ว่ามันกำลังทำอะไร ปัญหาคือเนื่องจากสถานะ HTTP กลับมาเป็น 500 $.ajax()เรียกใช้ฟังก์ชันข้อผิดพลาดที่ส่งไป
Chris Charabaruk

คำตอบ:


309

ลอง:

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

127
ฉันชอบใช้ JSON.parse (xhr.responseText)
Phil-R

68
evalเป็นความชั่วร้าย ... stackoverflow.com/questions/646597/…
ภาษาเยอรมัน Latorre

19
การใช้evalที่นี่ไม่สมเหตุสมผลนัก หากคุณต้องการที่จะแยกการตอบสนอง JSON JSON.parseใช้ ในกรณีของ OP การตอบสนองไม่ได้เป็น JSON หรือ JavaScript ดังนั้นคุณevalเพียงแค่จะทำให้เกิด SyntaxError
Mark Amery

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คุณสมบัติของพารามิเตอร์คำขอ


ฉันมีปัญหา 'parsererror' ใน IE8 แต่ทำงานใน IE7 สำหรับการร้องขอ JSONP ข้ามที่มา แต่คุณสมบัติการตอบกลับข้อความอยู่ที่ไหน ฉันไม่เห็นมันทุกที่ในขณะที่ตรวจสอบวัตถุตอบสนองระหว่างการดีบัก ฉันเห็น ReadyState สถานะ statusText และวิธีอื่น ๆ ของวัตถุคำขอ $ .ajax ()
NLV

วัตถุ xhr ควรมี responseText หรือ responseXML ขึ้นอยู่กับประเภท MIME ของการตอบกลับ
tvanfosson

ฉันพบปัญหา ในความเป็นจริง jQuery ในขณะที่สร้างคำขอ JSONP จะไม่สร้างวัตถุ XHR เลย JSON-Padding เป็นเพียงการอ้างอิงสคริปต์แบบไดนามิกที่มีการเพิ่มชี้ไปที่ URL และข้อมูล json จะถูกห่อด้วยวิธีการที่ได้รับการเรียก ดังนั้น XHR จึงไม่ได้ใช้เลย
NLV

มีปัญหากับ IE8 และ cross-origin ใช้เวลาทั้งวันในวันนี้ :(. 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 หน้าซึ่งบอกว่าไม่มีไฟล์อยู่
James Toomey

สวัสดีเจมส์หากมีการโยนข้อผิดพลาด "ไม่พบ" ที่หมายถึงไม่สามารถหาวิธี "Url" หรือ "การกระทำ"
Karthikeyan P


0

ฉันใช้สิ่งนี้และทำงานได้อย่างสมบูรณ์

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

xhr.responseText return {ข้อผิดพลาด: "ข้อผิดพลาดใน ..... "} จากนั้น iam ใช้ JSON.parse เพื่อวิเคราะห์ JSON ลองใช้
Juan Silupú Maza

แก้ไขคำตอบหากคุณต้องการเพิ่มอะไรลงไป ความคิดเห็นเป็นการชั่วคราวและคำถาม / คำตอบนั้นถาวรมากขึ้น
ejderuby

-1

หากคุณไม่ได้มีข้อผิดพลาดของเครือข่ายและต้องการแสดงข้อผิดพลาดจากแบ็กเอนด์สำหรับสิทธิ์พิเศษไม่เพียงพอเซิร์ฟเวอร์ตอบสนองของคุณด้วย 200 และข้อผิดพลาด จากนั้นในเครื่องมือจัดการความสำเร็จของคุณให้ตรวจสอบ data.status == 'error'


1
ทำไมพื้นผิวที่มี 200? 200 เป็นสถานะ OK เขาควรกลับสถานะข้อผิดพลาดด้วยข้อความที่กำหนดเอง
Dementic

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.