2013-05-15 26 views
5

Tôi hy vọng có thể tùy chỉnh các đối tượng lỗi được truyền cho máy khách nếu ngoại lệ xảy ra trên máy chủ.Xử lý ngoại lệ trên máy chủ, tùy chỉnh đối số không thành công trên máy khách

Tôi đang sử dụng 'rồi' chức năng trên máy khách để xử lý thành công và thất bại:

hub.server.login(username, password).then(function(result) { 
    // use 'result' 
}, function(error) { 
    // use 'error' 
}); 

Nếu đăng nhập thành công, 'kết quả' là giá trị trả về của phương pháp đăng nhập trên máy chủ. Nếu đăng nhập thất bại, tôi ném một ngoại lệ của 'CustomException'. Đây là ngoại lệ với thuộc tính 'Mã'.

if (!IsValidLogin(username, password)) 
    throw new CustomException { Code: "BADLOGIN", Message: "Invalid login details" }; 

Nếu tôi có ngoại lệ chi tiết được bật, đối số 'lỗi' trên máy khách là 'Chi tiết đăng nhập không hợp lệ' - thuộc tính Message của ngoại lệ.

Có cách nào tôi có thể thay đổi có chọn lọc kết quả lỗi từ chuỗi thành đối tượng phức tạp không? tức là nếu 'CustomException' được ném trong phương thức trung tâm, trả về đối tượng {Code: [...], Message: [...]} cho trình xử lý lỗi phía máy khách?

này phải chứng minh những gì tôi muốn xem trên máy khách:

hub.server.login(username, password).then(function(userInfo) { 
    alert("Hello " + userInfo.Name); 
}, function(err) { 
    if (err.Code === "BADLOGIN.USERNAME") 
     alert("Unrecognised user name"); 
    else if (err.Code === "BADLOGIN.PASSWORD"); 
     alert("Invalid password"); 
    else 
     alert("Unknown error: " + err.Message); 
}); 

(Lưu ý 'Mã' và 'Thư' tài sản trên 'err').

+0

Tại sao bạn không chỉ trả về một đối tượng tùy chỉnh thay vì ném một lỗi? –

+0

Nó sẽ không được sạch sẽ. Tôi nghĩ rằng tôi biết những gì bạn có nghĩa là, một số loại đối tượng trở lại có một 'Kết quả' và một 'Lỗi' tài sản - một trong số đó sẽ được thiết lập, một trong số đó sẽ là null. Tôi đã sử dụng này trước đây, nhưng tôi chỉ tự hỏi nếu một ngoại lệ có thể được tốt hơn cho hơn tôi có thể có sự thành công và đăng nhập thất bại tự động tách biệt trên máy khách do bản chất của callback 'sau đó'. – Barguast

+0

tức là .then (hàm (kết quả) {if (result.error) {// failed} else {// success}}); Nó sẽ hoạt động, nhưng nó không theo mô hình hứa hẹn thông thường có một nhánh thành công và thất bại riêng biệt. – Barguast

Trả lời

3

Khi bạn gọi MapHubs với EnabledDetailedErrors thiết lập là true như sau:

RouteTable.Routes.MapHubs(new HubConfiguration { EnableDetailedErrors = true }); 

bạn sẽ nhận được tin nhắn của chuỗi ngoại lệ của bạn như là tham số để không xử lý của bạn.

Tôi thấy rằng bạn đã tìm ra điều này, nhưng tôi bao gồm mã phía máy chủ để bật các lỗi chi tiết cho bất kỳ ai khác có thể tìm thấy câu hỏi này sau.

Thật không may là không có cách nào dễ dàng để gửi một đối tượng phức tạp đến trình xử lý không thành công.

Bạn thể làm điều gì đó như thế này mặc dù:

if (!IsValidUsername(username)) 
{ 
    var customEx = new CustomException { Code: "BADLOGIN.USERNAME", Message: "Invalid login details" }; 
    throw new Exception(JsonConvert.SerializeObject(customEx)); 
} 
if (!IsValidPassword(username, password)) 
{ 
    var customEx = new CustomException { Code: "BADLOGIN.PASSWORD", Message: "Invalid login details" }; 
    throw new Exception(JsonConvert.SerializeObject(customEx)); 
} 

Sau đó trên máy khách:

hub.server.login(username, password).then(function(userInfo) { 
    alert("Hello " + userInfo.Name); 
}, function(errJson) { 
    var err = JSON.parse(errJson); 
    if (err.Code === "BADLOGIN.USERNAME") 
     alert("Unrecognised user name"); 
    else if (err.Code === "BADLOGIN.PASSWORD"); 
     alert("Invalid password"); 
    else 
     alert("Unknown error: " + err.Message); 
}); 

Tôi biết điều này là xấu xí, nhưng nó phải làm việc.

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