2012-08-27 42 views
19

Tôi muốn biết cách tốt nhất để quản lý phản hồi lỗi máy chủ trên các mô hình mới, cập nhật hoặc xóa. Tại thời điểm này máy chủ trả về mã trạng thái http # 400. Nhưng trình xử lý lỗi mặc định trong Backbone không hiển thị lỗi.Quản lý phản hồi lỗi máy chủ với xương sống

Tôi làm cách nào để hiển thị các lỗi này?

Có ok khi máy chủ trả về tiêu đề lỗi http khi xác thực bên máy chủ không thành công? (Có thể trả lại thành công phản hồi thành công với thông báo trạng thái = 'LRI')

Trả lời

20

Nếu bạn trả lại trạng thái http khác 2XX, bạn đã hoàn thành một nửa công việc. :-) Về cơ bản, những gì bạn có thể làm là gửi lại bất cứ điều gì bạn muốn trở lại như là phản ứng.

Ví dụ, bạn có thể chỉ cần gửi lại một cái gì đó như thế này:

// Send back http status 500 
echo 'Could not save, server error'; 

Tình trạng 500 sẽ kích hoạt callback lỗi Backbone và trả lời của bạn là một đối tượng jqXHR. Trong ví dụ trên, bạn có thể nhận được thông báo bằng cách làm một cái gì đó như thế này trong gọi lại lỗi của bạn.

model.save({},{ 
    error: function(model, response) { 
     console.log(response.responseText); 
    } 
}); 

Đây là cách đơn giản nhất để lấy lại một số dữ liệu/thông báo về lỗi xảy ra phía máy chủ. Bạn có thể tất nhiên, tạo ra dữ liệu phức tạp hơn để được trả lại từ máy chủ:

// I'm using SLIM RESTful framework... 
$dataOut = array('error'=>'Validation type', 'message'=>'Did not validate'); 
$response->body(json_encode($dataOut)); 

Trong cùng một thời trang, bạn có thể truy cập mà phản ứng như vậy:

model.save({},{ 
    error: function(model, response) { 
     var responseObj = $.parseJSON(response.responseText); 
     console.log('Type: ' + responseObj.error + ' Message: ' + responseObj.message); 
    } 
}); 

Hoặc một cái gì đó dọc theo những đường.

Bởi vì phản ứng thông qua vào callback lỗi của bạn là đối tượng jqXHR, bạn có thể truy cập vào tất cả các thuộc tính của nó mà bạn có thể muốn sử dụng:

E.g. 
response.readyState 
response.status 
response.statusText // etc. 

Backbone chỉ cần tình trạng http trở về từ máy chủ để làm điều đó.

+0

Tôi đang đối mặt với vấn đề này ngay hôm nay. Đây là câu hỏi: nếu SLIM RESTful API của tôi (về mặt lý thuyết) có thể được sử dụng bởi các ứng dụng khách ngoài web (ví dụ: iOS, v.v.) thì có ổn không nếu SLIM chuyển lại mã trạng thái HTTP không phải 200 trong các trường hợp như thế này? Các tình huống được mô tả ở trên (ví dụ: lỗi xác thực biểu mẫu, v.v.) được cho là không phải lỗi máy chủ, mà đúng hơn là máy chủ phản hồi đúng cách với đầu vào người dùng kém. – hairbo

+1

Tôi nghĩ rằng bình luận của bạn là 2 phần. 1) SLIM có nên chuyển lại mã trạng thái http không phải 200 không? Tôi sẽ tưởng tượng có như tôi không thể thấy làm thế nào nó sẽ có thể bị tổn thương bằng cách làm như vậy. Rất nhiều công cụ phụ của khách hàng dựa vào mã trạng thái đó để thực hiện thành công hoặc gọi lại lỗi. 2) Tình trạng 500 có phù hợp để xác nhận không? Không. Trong ví dụ của tôi - tôi vừa tạo ra một vấn đề là một vấn đề cần lưu. Tôi đoán nếu bạn đang thực hiện xác thực phía máy chủ, yêu cầu 400 có thể là một lựa chọn tốt. – jmk2142

+0

Không chắc chắn tôi đã đề xuất 5xx cho các lỗi xác thực, nhưng đó không thực sự là vấn đề. Tôi nghĩ rằng tôi chỉ là một stickler, nhưng mã lỗi máy chủ đề nghị (với tôi, anyway) rằng một cái gì đó đã đi sai với máy chủ * *. Lỗi xác thực thực sự là máy chủ phản hồi đúng cách với dữ liệu xấu từ máy khách *. Vì vậy, ở một mức độ nào đó, phản hồi với dữ liệu 4xx về dữ liệu khách hàng xấu có vẻ sai. Tuy nhiên, cả thế giới đang làm theo cách này, và tôi sẽ không chiến đấu với toàn thế giới vào thời điểm đó. (-; – hairbo

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