2013-05-15 10 views
5

पर असफल तर्क को अनुकूलित करने, सर्वर पर हैंडलिंग अपवाद, मैं सर्वर पर एक अपवाद होने पर क्लाइंट को पारित त्रुटि ऑब्जेक्ट को कस्टमाइज़ करने में सक्षम होने की उम्मीद कर रहा हूं। लॉगिन सफल होता हैक्लाइंट

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

हैं, 'परिणाम' सर्वर पर लॉग इन विधि के रिटर्न मान है:

मैं सफलता और विफलता को संभालने के लिए क्लाइंट पर 'फिर' समारोह का उपयोग कर रहा

। अगर लॉगिन विफल रहता है, तो मैंने 'कस्टम अपवाद' का अपवाद फेंक दिया। यह 'कोड' संपत्ति के साथ एक अपवाद है। अपवाद के संदेश संपत्ति -

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

अगर मैं अपवाद सक्षम विस्तृत, क्लाइंट पर 'त्रुटि' तर्क 'अमान्य लॉगइन विवरण' है।

क्या कोई तरीका है कि मैं स्ट्रिंग से एक जटिल ऑब्जेक्ट में त्रुटि परिणाम को चुनिंदा रूप से बदल सकता हूं? यानी यदि 'कस्टम अपवाद' को हब विधि में फेंक दिया गया है, तो क्लाइंट-साइड विफल हैंडलर के लिए एक {कोड: [...], संदेश: [...]} ऑब्जेक्ट लौटाएं?

यह प्रदर्शित करना चाहिए मैं ग्राहक पर देखना चाहते हैं क्या:

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

(नोट 'कोड' और 'अं' पर 'संदेश' गुण)।

+0

आप त्रुटि को फेंकने के बजाय एक कस्टम ऑब्जेक्ट क्यों नहीं लौटते? –

+0

यह सिर्फ उतना ही साफ नहीं होगा। मुझे लगता है कि मुझे पता है कि आपका क्या मतलब है, किसी प्रकार की रिटर्न ऑब्जेक्ट जिसमें 'परिणाम' और 'त्रुटि' संपत्ति है - जिसमें से एक सेट किया जाएगा, जिसमें से एक शून्य होगा। मैंने पहले इसका उपयोग किया है, लेकिन मैं बस सोच रहा हूं कि अगर मैं सफलता प्राप्त कर सकता हूं और 'तत्काल' कॉलबैक की प्रकृति के कारण क्लाइंट पर विफल लॉगिन विफल हो सकता है। – Barguast

+0

i.e. .then (फ़ंक्शन (परिणाम) {if (result.error) {// विफल} अन्य {// सफलता}}); यह काम करेगा, लेकिन यह अलग सफलता और विफलता शाखा वाले वादे के सामान्य पैटर्न का पालन नहीं करेगा। – Barguast

उत्तर

3

इस प्रकार जब आप सही पर सेट किया EnabledDetailedErrors साथ MapHubs फोन:

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

आप अपने असफल हैंडलर के लिए पैरामीटर के रूप में अपने अपवाद के संदेश स्ट्रिंग प्राप्त होगा।

मुझे लगता है कि आप इसे पहले से ही समझ चुके हैं, लेकिन मैं किसी अन्य व्यक्ति के लिए विस्तृत त्रुटियों को सक्षम करने के लिए सर्वर साइड कोड भी शामिल कर रहा हूं जो बाद में यह प्रश्न पा सकता है।

दुर्भाग्य से असफल हैंडलर को जटिल वस्तु भेजने का कोई आसान तरीका नहीं है। ग्राहक पर फिर

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

:

आप कुछ इस तरह कर सकता है, हालांकि

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

मैं जानता हूँ कि यह बदसूरत है, लेकिन यह काम करना चाहिए।