2013-05-15 10 views
5

Sunucuda bir özel durum meydana gelirse istemciye iletilen hata nesnelerini özelleştirebileceğimi umuyordum. Oturum başarılıSunucudaki özel durumlar, istemcideki başarısız değişkenini özelleştirme

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

ise 'sonuç' sunucudaki Girişi yönteminin dönüş değeri: Ben başarı ve başarısızlık işlemek için istemci üzerinde 'sonra' fonksiyonunu kullanıyorum

. Giriş başarısız olursa, 'CustomException' istisnası atarım. Bu bir 'Kod' özelliğiyle bir istisnadır. istisna Mesajı özelliği -

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

Ben istisnalar etkin ayrıntılı varsa, istemci üzerinde 'hatası' argümanı 'Geçersiz giriş bilgileri' dir.

Hata sonucunu bir dizeden karmaşık bir nesneye seçici olarak değiştirebilmemin bir yolu var mı? Örneğin, 'CustomException' bir hub yöntemine atılırsa, istemci tarafı başarısız işleyicisi için bir {Kod: [...], İleti: [...]} nesnesi döndürün?

Bu benim istemci üzerinde görmek istiyorum neyi göstermelidir:

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

('Kod' ve 'err' üzerinde 'Mesaj' özelliklerini unutmayın). aşağıdaki gibi

+0

Neden bir hata atmak yerine özel bir nesne göndermiyorsunuz? –

+0

Sadece temiz olmaz. Sanırım ne demek istediğimi biliyorum, bir 'Sonuç' ve 'Hata' özelliğine sahip bir tür geri dönüş nesnesi - biri belirlenecek, biri boş olacak. Bunu daha önce kullandım, ama bir istisnanın daha iyi verilip verilemeyeceğini merak ettim ve bu başarısızlık, 'o zaman' geri aramalarının doğası gereği müşteriye otomatik olarak ayrı ayrı giriş yapamaz. – Barguast

+0

i.e.then (function (sonuç) {if (result.error) {// başarısız} else {// success}}); Çalışırdı, ama ayrı bir başarı ve başarısızlık dalına sahip olan sözlerin alışılmadık düzenini takip etmezdi. – Barguast

cevap

3

true olarak ayarlanmış EnabledDetailedErrors ile MapHubs aradığında:

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

Eğer başarısız işleyicisi parametre olarak istisna Mesajı dizesini alacaktır.

Bunu daha önce anladığınızı görüyorum, ancak bu soruyu daha sonra bulabilecek herkes için ayrıntılı hataları etkinleştirmek üzere sunucu tarafı kodunu ekliyorum.

Maalesef, hata işleyicisine karmaşık bir nesne göndermenin kolay bir yolu yoktur. Ben bu çirkin olduğunu biliyorum

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

, ancak çalışması gerekir: istemci üzerinde Sonra

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

:

Sen olsa böyle bir şey yapabilirdi.