2009-01-02 35 views
23

Hãy nói rằng tôi có những điều sau đây gọi jQuery AJAX:Làm thế nào để bạn xử lý lỗi từ các cuộc gọi AJAX?

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    } 
}); 

Bây giờ, khi cuộc gọi AJAX này được thực hiện tôi muốn mã server-side để chạy qua một vài kiểm tra xử lý lỗi (ví dụ như là người dùng vẫn đăng nhập , họ có được phép sử dụng cuộc gọi này không, là dữ liệu hợp lệ, v.v ...). Nếu phát hiện thấy lỗi, làm thế nào để tôi bong bóng thông báo lỗi đó trở lại phía máy khách?

Suy nghĩ ban đầu của tôi là trả về một đối tượng JSON có hai trường: error and errorMessage. Những trường này sau đó sẽ được kiểm tra trong cuộc gọi jQuery AJAX:

$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     if (result.error == "true") 
     { 
      alert("An error occurred: " & result.errorMessage); 
     } 
     else 
     { 
      // Do stuff 
     } 
    } 
}); 

Điều này có vẻ hơi khó khăn với tôi, nhưng nó hoạt động. Có một lựa chọn tốt hơn?

Trả lời

23

Cá nhân, tôi có mã tương tự với mã sau trong thư viện của mình.

$.ajaxSetup({ 
    error: function(xhr){ 
     alert('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText); 
    } 
}); 

jQuery docs Ajax/jQuery.ajaxSetup

Cách tốt nhất để bong bóng mà lỗi từ phía máy chủ (sử dụng php) sang phía khách hàng là để gửi một tiêu đề thông qua các yêu cầu Ajax ở đâu đó vào những năm 400 (mà luôn gắn liền với lỗi). Khi yêu cầu Ajax nhận được nó, nó sẽ kích hoạt chức năng lỗi của bạn. Điều này cũng có nghĩa là bạn không phải xác định lỗi: gọi trong mọi lệnh gọi .ajax $.

header('HTTP/1.0 419 Custom Error'); 

Trích từ w3.org header information

Lỗi 4xx, 5xx Các 4xx mã chỉ dành cho trường hợp trong đó các khách hàng dường như đã sai lầm, và các mã 5xx cho các trường hợp trong đó các máy chủ là nhận thức được rằng máy chủ đã bị lỗi. Không thể phân biệt các trường hợp này nói chung, vì vậy sự khác biệt chỉ là thông tin. Phần nội dung có thể chứa tài liệu mô tả lỗi ở dạng có thể đọc được của con người. Tài liệu ở định dạng MIME và chỉ có thể ở dạng văn bản/đơn giản, văn bản/html hoặc một cho các định dạng được chỉ định là có thể chấp nhận được trong yêu cầu.

3

Chức năng jQuery ajax có chấp nhận một tham số khác ở cuối, một cuộc gọi lại cho các cuộc gọi không thành công không? Nếu vậy, chỉ cần thêm fail:function(...){..} sau khi gọi lại thành công.

+0

Tôi tin rằng cũng có một lỗi "lỗi". – BobbyShaftoe

+0

Có, gọi lại "lỗi" hoạt động giống như cách gọi lại "thành công". Tuy nhiên, tôi đã không chắc chắn nếu trở về một lỗi HTTP là cách tiếp cận tốt nhất ở đây. –

+0

Miễn là bạn chăm sóc lỗi ở phía máy chủ (đăng nhập, v.v.), không có vấn đề gì khi gửi nó cho máy khách, vì vậy nó cũng có thể xử lý được. – rodbv

0

Trả lại mã lỗi ở phía máy chủ bằng cách sử dụng lỗi HTTP tốt nhất tương đương với lỗi là gì. Sau đó, sử dụng gọi lại lỗi. Điều này cũng sẽ cho phép bạn hiển thị các lỗi do máy chủ web của bạn cung cấp.

5
$.ajax({ 
    type: "POST", 
    url: "MyUrl", 
    data: "val1=test", 
    success: function(result){ 
     // Do stuff 
    }, 
    error: function(request,status,errorThrown) { 
     // There's been an error, do something with it! 
     // Only use status and errorThrown. 
     // Chances are request will not have anything in it. 
    } 
}); 
+1

Đối với tôi, trạng thái luôn là "lỗi" và lỗiĐược hiển thị luôn không xác định. Làm thế nào để bạn có được bất kỳ thông tin thú vị ra khỏi đây? –

+0

Xem: http://api.jquery.com/jQuery.ajax/, lỗi –

+0

Cũng lưu ý rằng 'request.status' chứa mã lỗi. –

0

Khá muộn để trả lời câu hỏi này nhưng tôi nghĩ Nó sẽ có lợi cho một số người dùng es6 và jquery 2.2.

tôi thường làm theo này (phương pháp thu nhập hoãn lại) trong mã của tôi

sendAjaxRequest(URL, dataToSend) { 
    return $.ajax({ 
     type  : 'POST', 
     url   : URL, 
     data  : JSON.stringify(dataToSend), 
     dataType : 'json' 
    }).fail((responseData) => { 
     if (responseData.responseCode) { 
      console.error(responseData.responseCode); 
     } 
    }); 
}, 

tôi có kèm theo một fail phương pháp thu nhập hoãn lại mà sẽ được gọi nếu một số lỗi xảy ra. Nó là một cấu trúc thay thế cho tùy chọn gọi lại lỗi, phương thức .fail() thay thế phương thức .error() không được chấp nhận trong câu lệnh jquery mới nhất.

Tiếp từ nơi gọi sendAjaxRequest tôi sử dụng then jquery lời hứa gọi lại

sendAjaxRequest(URL, dataToSend) 
.then(
    (success) => { 
    }, 
    (error) => { 
    } 
); 

Nó sẽ gọi thành công hay hàm lỗi dựa trên các phản ứng nhận được từ máy chủ.

Các vấn đề liên quan