Làm cách nào để có được văn bản phản hồi lỗi jQuery $ .ajax?


234

Tôi đang gửi một phản hồi lỗi cho jQuery của tôi. Tuy nhiên, tôi không thể nhận được văn bản phản hồi (trong ví dụ bên dưới đây sẽ là Cuốn đến bãi biển )

Điều duy nhất jQuery nói là "lỗi".

Xem ví dụ này để biết chi tiết:

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

Bây giờ kết quả của tôi ist:

đăng nhập:

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

cảnh báo:

Không thể làm vì: lỗi

Có ý kiến ​​gì không?


Vấn đề dường như là trong mã php của bạn. Bạn không cần 2 ngắt dòng giữa các tiêu đề và văn bản cơ thể? Liệu các headerchức năng xử lý này?
rfunduk

thenduks: PHP biết nó đang làm gì. Vấn đề là bởi vì trạng thái HTTP trở lại là 500, $.ajax()gọi hàm lỗi được truyền cho nó.
Chris Charabaruk

Câu trả lời:


309

Thử:

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

127
Tôi thích sử dụng JSON.parse (xhr.responseText)
Phil-R


19
Sử dụng evalở đây không có nhiều ý nghĩa. Nếu bạn muốn phân tích một phản hồi JSON, hãy sử dụng JSON.parse. Trong trường hợp của OP, phản hồi thậm chí không phải là JSON hoặc JavaScript, do đó, bạn evalsẽ gây ra SyntaxError.
Đánh dấu Amery

1
JSON.parse cần IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/iêu ). Nếu cần hỗ trợ cho các trình duyệt cũ hơn, hãy sử dụng $ .parseJSON (từ jQuery, api.jquery.com/jQuery.parseJSON )
Julian

1
không thay đổi thực tế xhrkhông xác định
phil294

53

Đối với tôi, điều này chỉ đơn giản là hoạt động:

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

51

Nhìn vào thuộc responseTexttính của tham số yêu cầu.


Tôi có một vấn đề 'trình phân tích cú pháp' trong IE8 nhưng đang hoạt động trong IE7 cho yêu cầu JSONP có nguồn gốc chéo. Nhưng tài sản answerText ở đâu? Tôi không thấy nó ở bất cứ đâu trong khi kiểm tra đối tượng phản hồi trong quá trình gỡ lỗi. Tôi chỉ thấy readyState, status, statusText và các phương thức khác của đối tượng yêu cầu $ .ajax ().
NLV

Đối tượng xhr phải có answerText hoặc answerXML tùy thuộc vào loại MIME của phản hồi.
tvanfosson

Tôi tìm thấy vấn đề. Trong thực tế jquery trong khi tạo một yêu cầu JSONP sẽ không tạo ra đối tượng XHR. JSON-Padding chỉ là các tham chiếu tập lệnh động được thêm vào trỏ tới URL và dữ liệu json sẽ được gói bằng một phương thức được gọi. Vì vậy, XHR hoàn toàn không được sử dụng.
NLV

Có vấn đề với IE8 và nguồn gốc chéo. Đã dành cả ngày hôm nay :(. Stackoverflow.com/questions/8165557/ từ
NLV

Làm thế nào để bạn phân tích repsponseText thành một đối tượng json?
chovy


7

Đây là những gì làm việc cho tôi

    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 cũng có sẵn. Vì vậy, chúng tôi có thể tránh $ .parseJSON (xhr.responseText)
Prasanth

4

Điều này sẽ cho phép bạn xem toàn bộ phản hồi chứ không chỉ giá trị "answerText"

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

3

bạn cũng có thể thử nó:

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

3

Nếu bạn muốn nhận Lỗi cú pháp với số dòng, hãy sử dụng

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

Tôi đã không nhận được số dòng, nhưng "cảnh báo (lỗi)" đã cho tôi "Không tìm thấy" khi tôi gọi $ .get để đọc một tệp, đó là những gì tôi cần. Xhr.responseText đã trả về một trang 404 cho tôi biết tệp không tồn tại.
James Toomey

Xin chào James, nếu nó ném lỗi "Không tìm thấy" có nghĩa là không thể tìm thấy phương thức "Url" hoặc "Hành động".
Karthikeyan P

3

Cách tiếp cận đơn giản tốt nhất:

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

0

Tôi đã sử dụng nó, và nó hoạt động hoàn hảo.

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

xhr.responseText trả về {error: "lỗi trong ....."}. sau đó, tôi sử dụng JSON.parse để phân tích cú pháp JSON. thử dùng
Juan Silupú Maza

Chỉnh sửa câu trả lời nếu bạn muốn thêm bất cứ điều gì vào nó. Nhận xét là tạm thời, và câu hỏi / câu trả lời là lâu dài hơn.
ejderuby

-1

Nếu bạn không gặp lỗi mạng và muốn xuất hiện lỗi từ phần phụ trợ, vì không đủ đặc quyền, hãy gửi phản hồi của bạn bằng 200 và thông báo lỗi. Sau đó, trong trình xử lý thành công của bạn, hãy kiểm tra dữ liệu.status == 'error'


1
Tại sao bề mặt với 200? 200 là trạng thái OK. Anh ta nên trả lại một trạng thái lỗi với một thông báo tùy chỉnh.
Mất trí nhớ

Hầu hết các apis tôi sử dụng thực sự trả về 200 với mã lỗi bên trong thân phản hồi.
chovy

trả lại một cái gì đó ngoài 200 có thể có vấn đề khi bạn muốn hiển thị mã lỗi hoặc thông báo lỗi từ phụ trợ. non-200 thường được sử dụng để chỉ ra rằng bản thân yêu cầu không thành công do lý do mạng ... không phải là người dùng không có quyền chẳng hạn. Trong ứng dụng của chúng tôi, chúng tôi sử dụng các lời hứa trong "MakeAPICall" để tìm mã lỗi trong phản hồi 200 và kích hoạt failphương thức thay vì donephương thức. Tất cả các yêu cầu trả về một đối tượng có chứa một đối tượng 'trạng thái' với mã và thông báo.
chovy

1
vi.wikipedia.org/wiki/HTTP_403 cho phép. Một số điều thú vị hơn đọc ở đây stackoverflow.com/questions/7996569/ từ
Dementic

403 là giải thích khá cơ bản ... và bạn không thể gửi một phản hồi. Sự cho phép của tôi chỉ là một ví dụ. Có những mã lỗi tôi muốn hiển thị cụ thể theo ứng dụng. Mã HTTP không bao gồm tất cả các mã này.
chovy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.