2015-01-23 14 views
5

यह नोड में एक सम्मेलन है अतुल्यकालिक संचालन करने के लिए एक त्रुटि पैरामीटर पारित करने के लिए:जाँच हो रही है त्रुटि मापदंडों

async.someMagicalDust(function(callback) { 
    // some asynchronous task 

    // […] 
    callback(); 

}, function(err) { 
    // final callback 

    if(err) throw err;  
    // […] 

}); 

शायद मैं भी अनुभवहीन हूँ, लेकिन मैं कभी नहीं if(variable) अंकन के एक बड़े प्रशंसक किया गया है - शायद have already been discussed many times in the past के कारणों से सी से विरासत में मिला।

if(typeof err !== 'undefined' && err !== null) 

थोड़ा भी वर्बोज़ है:

दूसरी ओर, मैं कभी कभी एक null पैरामीटर और इस त्रुटि की जांच का सामना करना पड़ा।

एक अन्य समाधान

if(err != null) 

होगा, लेकिन मुझे लगता है कि non-strict check मुश्किल हो सकता है, भले ही मैं इसे सामान्य बातों पर विचार करते अशक्त के साथ तुलना।

नोड में त्रुटि पैरामीटर जांचने का सबसे अच्छा तरीका क्या है?

उत्तर

2

if(err) का उपयोग करें।

यह इस फैशन में उपयोग करने के लिए डिज़ाइन किया गया है। नोड-शैली कॉलबैक को वास्तविक त्रुटि के मामले में त्रुटि को गैर-झूठी मान में सेट करना माना जाता है। त्रुटि को इंगित करने के लिए आपको err'' या 0 सेटिंग करने का कोई सौहार्दपूर्ण उदाहरण नहीं मिलेगा।

बस YlinaGreed की तरह उल्लेख किया गया है, मॉड्यूल सम्मेलनों भी हो सकता है NaN को 0 को undefined को null से cnahge हैं, तो आप अभी भी सुरक्षित हैं। मैंने कभी भी if(err) का उपयोग करके इस पर हिट नहीं किया है।

दूसरी ओर, आप coffescript, जो आप

unless err? then... 

में के लिए

if (typeof err === "undefined" || err === null) { 

अनुवाद होगा सबसे आम पैटर्न की नकल उतार का उपयोग कर सकते हैं।

सम्मेलन लगता है (Caolan मैकमोहन, async के लेखक द्वारा) एक त्रुटि गुजर जाना है:

कुछ लिंक if(err) दृष्टिकोण की पुष्टि के लिए किसी भी त्रुटि के लिए पहली तर्क और null के रूप में ऑब्जेक्ट करें यदि आप एक खाली वस्तु पास करते हैं, तो यह अभी भी एक त्रुटि है।

यदि आप लोकप्रिय express ढांचे का उपयोग करते हैं, तो आपको मिडलवेयर से लौटने के लिए next कॉलबैक का उपयोग करना चाहिए, जो कि इरबैक सम्मेलन का पालन करता है।

मुझे विश्वास है कि ज्यादातर लोगों को next(null) से अधिक संक्षिप्त next() पसंद करते हैं, जिसका मतलब है कि पहला तर्क undefined बजाय null का मूल्यांकन होगा, और यह निश्चित रूप से पूरी तरह से सामान्य उपयोग है।

+0

आप फिर भी गलती == बातिल से अधिक दूसरे उदाहरण अनुशंसा करेंगे (गैर सख्त समानता, एक ही परिणाम लाने) –

+0

मैं इसे की सिफारिश करेंगे, तभी आप उसे स्वत: जनरेट (जैसे coffeescript द्वारा) है। अन्यथा, कोड की योग्यता अन्य विचारों से अधिक है। – punund

+0

मुझे लगता है कि यह सही दृष्टिकोण है। क्या आपको "इस फैशन में उपयोग करने के लिए डिज़ाइन किया गया है" के लिए आधिकारिक स्रोत/संदर्भ मिल सकता है? –

0

मेरे लिए, सबसे अच्छा तरीका त्रुटि को संभालने के लिए है "अगर (गलती == नल)" यह केवल मामले मैं गैर सख्त ऑपरेटर का उपयोग कर रहा है, इन कारणों के लिए है:

  • केवल समाधान पर जो हमेशा काम करता है वह बहुत verbose है, जैसा कि आपने
  • से पहले कहा था कि आप केवल "शून्य" या "अपरिभाषित" पर भी जांच सकते हैं, लेकिन मैंने इसे एक बार किया, और कुछ महीने बाद, मैंने अपनी निर्भरताओं को अपडेट किया और .. सम्मेलन बदल गया, और मॉड्यूल अपरिभाषित के बजाय शून्य भेज रहा था।

यह ज्यादातर "सम्मेलन" का मामला है, मेरे पास है, और आप निश्चित रूप से अपना भी है ... बस दो "अच्छे" तरीकों में से एक को चुनने के लिए सावधान रहें।

0

नोड का प्राथमिक कॉलबैक सम्मेलन err के साथ पहले पैरामीटर के रूप में एक फ़ंक्शन पास करना है। मेरे अनुभव में यह जांचने के लिए हमेशा सुरक्षित रहता है कि क्या त्रुटि सच है - व्यवहार में यदि कोई त्रुटि होने पर आपकी त्रुटि शून्य हो जाती है तो समस्या कार्यान्वयन के साथ अधिक होती है। मैं हमेशा उम्मीद करता हूं कि err शून्य है कि कोई त्रुटि नहीं हुई है। त्रुटियों और सफलताओं के लिए अलग-अलग कार्यों के उपयोग के कारण यह भ्रमित हो सकता है, जो कुछ JQuery.Ajax और वादे की शैली में अधिक है। मुझे कॉल करने के लिए थोड़ा सा शब्दकोष होने के लिए डबल कॉलबैक मिलते हैं।

आपके उदाहरण को देखते हुए ऐसा लगता है कि आप एसिंक पुस्तकालय का उपयोग कर रहे हैं जो उत्कृष्ट है। मैं एक समानांतर विकल्प प्रदर्शन करने के लिए देख रहा हूँ, तो यह कैसे मैं इसे सेट अप है:

function doAThing(callback) { 
    var err; 

    // do stuff here, maybe fill the err var 

    callback(err); 
} 

function doAsyncThings(callback) { 
    var tasks = [function(done) { // stuff to do in async 
    doAThing(function(err) { 
     done(err); 
    }); 
    }]; 

    async.parallel(tasks, function(err) { // single callback function 
     callback(err); // I send the error back up 
    }); 
} 

ध्यान दें कि बजाय त्रुटि फेंकने की मैं इसे वापस bubbled अप अनुरोध श्रृंखला। ऐसे कुछ उदाहरण हैं जिन्हें मैं वास्तव में एक त्रुटि फेंकना चाहता हूं क्योंकि आप मूल रूप से "संपूर्ण ऐप को क्रैश" कह रहे हैं।

मुझे यह आसान लगता है और आपके कार्यों को कॉल करने के लिए उपयोग करने वाले पैरामीटर की मात्रा को कम करता है। क्या आप में इस सम्मेलन का उपयोग करते हैं तो आप बस इतना की तरह एक पैरामीटर के रूप कॉलबैक गुजर के बजाय एक नई अज्ञात समारोह बनाकर आसान बनाने में कर सकते हैं:

function doAThing(callback) { 
    var err; 

    // do stuff here, maybe fill the err var 

    callback(err); 
} 

function doAsyncThings(callback) { 
    var tasks = [function(done) { // stuff to do in async 
    doAThing(done); 
    }]; 

    async.parallel(tasks, callback); // the error is sent back to the original function 
} 

मुझे लगता है कि आम तौर पर आप कार्यों में उन त्रुटियों को हैंडल करना चाहते हैं वे इन्हें बुलाया जाता है। इसलिए इस मामले में doAsyncThings का कॉलर यह जांच सकता है कि कोई त्रुटि है या नहीं और इसे अपने दायरे के लिए उपयुक्त है (और यदि उपयोगकर्ता एपीआई कहता है तो शायद उपयोगकर्ता को बेहतर जानकारी प्रदान करें)।

संबंधित मुद्दे