2011-12-08 10 views
12

एक्सप्रेस/कनेक्ट के साथ मैं किसी भी प्रारूप में एक मध्यस्थ के समारोह की स्थापना कर सकते हैं:यह कैसे काम करता है? वैकल्पिक पहला तर्क एक्सप्रेस में इस्तेमाल किया (अरे, अनुरोध, रेस, अगले) या (अनुरोध, रेस, अगले)

function(req, res, next) // first argument will be a request 

या

function(err, req, res, next) // first argument will be an error 

एक्सप्रेस, कनेक्ट से वापस कदम, बुनियादी जावास्क्रिप्ट को: मुझे समझ नहीं आता कि यह कैसे एक वैकल्पिक पहला तर्क करना संभव है?

कैसे पता चलेगा कि मेरा कार्य err ऑब्जेक्ट को पहले स्वीकार करेगा? मैंने यह संभव बनाने के लिए सोचा था कि संरचना निम्न की तरह होनी चाहिए:

function(req, res, next, err) 

क्या मुझे यहां कुछ बुनियादी याद आ रही है? क्या यह पूछना संभव है कि फ़ंक्शन कितने तर्क की अपेक्षा कर रहा है?

संपादित करें: नीचे दिए गए उत्तरों के लिए धन्यवाद। लेकिन मिडलवेयर फ़ंक्शन को व्यक्त करने के लिए पास किया गया है, इसलिए arguments चर मान्य नहीं है। हालांकि length सही है ... मुझे लगता है कि मैंने इसे समझ लिया है, यह पुष्टि करना अच्छा होगा कि यह मामला है या नहीं। उदाहरण नीचे:

var fn; 

fn = function (one, two) {}; 
console.log(fn.length); // 2 

fn = function (one, two, three) {}; 
console.log(fn.length); // 3 
+0

मैं हमेशा सोच रहा था अगर यह संभव है या नहीं हो सकता है, तो अपने आप को कि अपनी नहीं राजी कर लिया! –

उत्तर

9

मुझे लगता है मैं यह पता लगा लिया है, कि कहीं ऐसा तो

var fn; 

fn = function (one, two) {}; 
console.log(fn.length); // 2 

fn = function (one, two, three) {}; 
console.log(fn.length); // 3 

हां, यह सही है है करने के लिए पुष्टि करने के लिए अच्छा होगा। lengthFunction उदाहरण की संपत्ति औपचारिक पैरामीटर (घोषित तर्क) की संख्या है। यह कल्पना की Section 13.2 में दूर छिपा हुआ 14 और 15.

कदम तो यह काफी आसान है कोड फ़ंक्शन को कॉल fn.length जाँच के लिए करने के लिए और यह वैकल्पिक पहला तर्क गुजरती हैं, या नहीं, इस पर निर्भर करता है। इसका मतलब यह है कि, यह सुनिश्चित करना कि चार-तर्क संस्करण को संभालने के लिए पूरी तरह से संभव है, लेकिन औपचारिक मानकों के बजाय arguments का उपयोग करके ढांचे को मूर्ख बना देता है। तो आप ऐसा नहीं करेंगे।:-)

(क्षमा याचना पहली बार अपने प्रश्न ग़लत व्याख्या के लिए।)

+0

* पीएस। क्या आप इस तकनीक का नाम जानते हैं? * – Ross

+0

@Ross: क्षमा करें, मुझे उस टिप्पणी को याद आया। मुझे नहीं पता कि इसका एक विशिष्ट नाम है। आप समारोह के * [arity] (http://en.wikipedia.org/wiki/Arity) * का परीक्षण कर रहे हैं। –

1

एक्सप्रेस काफी समय खर्च करता है समारोह की arity को देख; यानी वहाँ कितने तर्क हैं:

function foo(err, req, res, next) { 
    if (arguments.length === 3) { // err isn't there 
     next = res; 
     res = req; 
     req = err; 
    } 
    ... 
} 

तो। पता लगाएं कि कितने तर्क हैं, और तदनुसार घुमावदार चर। मैंने कुछ नोड.जेएस-मॉड्यूल भी देखे हैं जो आपके लिए स्वचालित रूप से कार्य करता है।

और जब मैंने हाल ही में जांच नहीं की है, तो कुछ ऐसे मामले थे जहां arguments -बिल्टिन के साथ गड़बड़ाना V8 में सभी अनुकूलन अक्षम कर देगा।

2

पहले फ़ंक्शन में 3 तर्क हैं, दूसरे में 4 तर्क हैं, इसलिए एक्सप्रेस/कनेक्ट तर्कों की संख्या को देखता है।

तर्कों के बीच स्विच करना संभव नहीं है।

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