2011-12-15 9 views
11

तो Node.js में कॉलबैक फ़ंक्शंस के लिए general convention त्रुटि के लिए पहले पैरामीटर को "आरक्षित" करना है (यदि कोई मौजूद है)। उदाहरण के लिए:Node.js सम्मेलन?

callSomeBlockingFcn(function callbackWhenDone(err, result) { 
    if(err) ... 
}); 

आप एक त्रुटि की तुलना में अधिक वापस जाने के लिए की जरूरत है - उदाहरण के लिए एक से अधिक डेटा सत्यापन त्रुटियों का कहना है, - यह गरीब रूप माना जाता है त्रुटि ऑब्जेक्ट की श्रृंखला पारित करने के लिए? उदाहरण:

var callSomeBlockingFcn = function(callback) { 
    // multiple errors to report back... 
    callback([ err1, err2, ...]); 
} 

या यह सरणियों से बचने और एक संपत्ति एक सरणी (यदि आवश्यक हो) को संदर्भित साथ एक वस्तु वापस जाने के लिए बेहतर है? उदाहरण:

var callSomeBlockingFcn = function(callback) { 
    // multiple errors to report back... 
    callback({ errors: [ err1, err2, ...] }); 
} 

उत्तर

9

3 साल बाद:

किसी को भी है कि एक कॉलबैक में एक सरणी डालता है मुझे पागल कर देगा।

सही समाधान error को पहली तर्क के रूप में वापस करने का है। यदि आप कई त्रुटियों को वापस करना चाहते हैं तो आप शायद असाधारण मामलों के लिए त्रुटियों का उपयोग कर रहे हैं।

किस मामले में इसे कॉलबैक के "मूल्य" स्लॉट में जाना चाहिए, यानी दूसरा तर्क। पहला तर्क एक एकल, अप्रत्याशित परिचालन त्रुटि के लिए है।

आप एक से अधिक अप्रत्याशित परिचालन त्रुटियों (संभावना नहीं) है, तो आप इस MultiError

मूल की तरह कुछ कर सकते हैं:

मुझे लगता है कि त्रुटियों की एक सरणी लौटने के साथ कुछ भी गलत नहीं है।

हालांकि आप एक नया कस्टम ValidationError वापस कर सकते हैं जिसमें एक संपत्ति "messages" है जो एक सरणी है।

एक)

function validateX(x, cb) { 
    ... 
    if (errorMessages) { 
    return cb(errorMessages); 
    } 
} 

ख)

function ValidationError(msgs) { 
    this.messages = msgs; 
} 

function validateX(x, cb) { 
    ... 
    if (errorMessages) { 
    return cb(new ValidationError(errorMessages)); 
    } 
} 
+0

+1 यह नोट करने के लिए कि त्रुटि प्रभावी रूप से 'त्रुटि' – laconbass

+1

होनी चाहिए, मैं आपको "त्रुटियों की एक सरणी लौटने में कुछ भी गलत नहीं है" * के लिए आपको नीचे छोड़ रहा हूं, लेकिन आपको 100 बिंदु बक्षीस * (जैसा कि कोई और जवाब जब मैं इसे और अधिक ध्यान आकर्षित करने के तो मैं और कोई नहीं करने के लिए अंक) * देना है bountied। हो सकता है कि 98 बिंदु शुद्ध लाभ फिर से और इस मुद्दे को फिर से विचार करना :-P ... क्योंकि मैं कैनन कि त्रुटियों की एक सरणी नोड में एक वैध अं पैरामीटर नहीं है लगता है कि एक छोटा सा प्रोत्साहन किया जाएगा। – HostileFork

+0

@HostileFork चुनौती स्वीकार कर ली :) निश्चित जवाब। – Raynos

4

एक ही मुद्दे के लिए एक खोज के माध्यम से इस सवाल का मिला। हालांकि मैंने चारों ओर देखा और निष्कर्ष पर पहुंचा कि मुझे विश्वास नहीं है कि err कुछ भी हो सकता है लेकिन त्रुटि या null

http://docs.nodejitsu.com/articles/errors/what-are-the-error-conventions

Node.js में, यह मानक अभ्यास उन्हें वापस लौट कर अतुल्यकालिक कार्यों में त्रुटियों को संभालने के लिए माना जाता है:

सबसे अच्छा "आधिकारिक" स्रोत मैंने पाया Nodejitsu की मदद विषय है वर्तमान फ़ंक्शन के कॉलबैक के लिए पहला तर्क। यदि कोई त्रुटि है, तो पहला पैरामीटर सभी विवरणों के साथ एक त्रुटि ऑब्जेक्ट पास कर दिया गया है। अन्यथा, पहला पैरामीटर शून्य है।

लेकिन मुझे लगता है कि आप अंतर्ज्ञान से तर्क दे सकते हैं कि ऐसा क्यों होना चाहिए।अगर कुछ था या कोई त्रुटि नहीं था तय करने के लिए कोड में if (err) परीक्षण का एक बहुत देखते हैं, फिर भी आप 0 या false या undefined या NaN या कोई रिक्त स्ट्रिंग पारित नहीं करना चाहिए। यदि आप चाहें तो if (err == null) के साथ परीक्षण करने में सक्षम होना चाहिए।

अं क्षेत्र है कि गैर-शून्य है, लेकिन मेल नहीं खाता if (err instanceof Error) कुशल लगता है में वापस कुछ पासिंग। तो मैं सुझाव देता हूं कि सरणी या वस्तुओं का उपयोग न करें। यदि आपने किया है, तो ध्यान दें कि आपकी सरणी में से कोई भी त्रुटि उस स्थान की पहचान नहीं करेगी जहां कुल त्रुटि बनाई गई थी। यही कारण है, जहां "वास्तविक त्रुटि" हुआ है, क्योंकि यह निर्णय के क्षण है कि त्रुटियों यह दिया गया था कुछ इसे संभाल सकता है नहीं थे।

बहरहाल, यह आप में कुछ अधिक परिश्रम करना होगा कि प्राप्त करने के लिए इसका मतलब है:

function MultipleError (errs) { 
    // http://stackoverflow.com/a/13294728/211160 

    if (!(this instanceof MultipleError)) { 
     return new MultipleError(errs); 
    } 

    Error.call(this); 
    this.errs = errs; 

    // captureStackTrace is V8-only (so Node, Chrome) 
    // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi 

    Error.captureStackTrace(this, MultipleError); 
}; 

MultipleError.prototype.__proto__ = Error.prototype; 
MultipleError.prototype.name = 'MultipleError'; 
MultipleError.prototype.toString = function() { 
    return 'MultipleError: [\n\t' + this.errs.join(',\n\t') + '\n]'; 
} 

थोड़ा overkill है, शायद। लेकिन यदि आप वास्तव में एकत्रीकरण का प्रतिनिधित्व करने के लिए कोई त्रुटि नहीं ले सकते हैं, और सोचें कि किसी को केवल एक के बजाय त्रुटियों के सेट में रुचि हो सकती है, तो ऐसा लगता है कि (?) यही वह है जो आप करना चाहते हैं ... यदि वे चाहते हैं तो errs सरणी की जांच करने के लिए कॉलर।

+0

'MultipleError.prototype .__ proto__' के बजाय, जो [जेएस अनुकूलन को रोक सकता है] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/The_performance_hazards_of__%5B%5BPrototype%5D% 5D_mutation), आप 'MultipleError.prototype = Object.create (Error.prototype, {constructor: {value: MultipleError}, नाम: {value:' MultipleError '}, toString करना चाहते हैं: {value: function() {//...}}}); ',' एकाधिक त्रुटि 'पर उन गुणों को बनाने के अतिरिक्त बोनस के साथ गैर-कॉन्फ़िगर करने योग्य और गैर-गणना योग्य। – snickle