2013-07-19 11 views
12

यह सवाल फैली कि What is Node.js' Connect, Express and "middleware"?मिडिलवेयर डिज़ाइन पैटर्न: कनेक्ट

की मैं जावास्क्रिप्ट सीखने का मार्ग जा रहा हूँ -> Node.js -> कनेक्ट -> एक्सप्रेस -> ... क्रम में करने के लिए एक आधुनिक वेब विकास ढेर का उपयोग करने के बारे में जानें। मेरे पास लो-लेयर नेटवर्किंग में पृष्ठभूमि है, इसलिए उठना और Node.js 'net और http मॉड्यूल के साथ जाना आसान था। विभिन्न हैंडलरों के अनुरोधों को रूट करने के लिए सर्वर का उपयोग करने का सामान्य पैटर्न प्राकृतिक और अंतर्ज्ञानी लग रहा था।

कनेक्ट करने के लिए आगे बढ़ते हुए, मुझे डर है कि मैं इस "मिडलवेयर" के डेटा के प्रतिमान और सामान्य प्रवाह को समझ नहीं पा रहा हूं। उदाहरण के लिए, अगर मैं कनेक्ट अला के साथ उपयोग के लिए कुछ मिडलवेयर बना देता हूं;

// example.js  
module.exports = function (opts) { 
    // ... 
    return function(req, res, next) { 
     // ... 
     next(); 
    }; 
}; 

और "उपयोग" यह कनेक्ट में के माध्यम से

var example = require('./example'); 
// ... 
var server = connect.createServer(); 
// ... 
server.use(example(some_paramater)); 

मैं जब मेरे मिडलवेयर कहा जाता हो जाता है पता नहीं है। इसके अतिरिक्त, अगर मैं use() अन्य मिडलवेयर में हूं, तो क्या मुझे उस क्रम पर गारंटी दी जा सकती है जिसमें मिडलवेयर कहा जाता है? Furthuremore, मुझे लगता है कि समारोह next()अगले (फिर से, मैं ऑर्डरिंग कैसे स्थापित करूं?) मिडलवेयर को कॉल करने के लिए उपयोग किया जाता है; हालांकि, कोई पैरामीटर (req, res, अगला) पास नहीं हो जाते हैं। क्या ये पैरामीटर किसी भी तरह से पारित हो गए हैं?

मैं कि इस्तेमाल किया मिडलवेयर मॉड्यूल के संग्रह एक साथ महसूस कर रहे हैं, http कॉलबैक के साथ शुरू अनुमान लगा रहा हूँ -> इसलिए कार्यक्षमता का एक समूह प्रारंभिक अनुरोध कॉलबैक की बीच और सर्वर में जोड़ा एक प्रतिक्रिया को समाप्त हुए ।

मैं मिडलवेयर प्रतिमान, और सूचना/निष्पादन के प्रवाह को समझने की कोशिश कर रहा हूं।

किसी भी मदद की बहुत सराहना की जाती है। पढ़ने के लिए

उत्तर

11

मिडलवेयर को फ़ंक्शन की श्रृंखला के रूप में कहा जाता है, जिसमें मिलान मार्गों (यदि लागू हो) के साथ मिडलवेयर परिभाषा आदेश (समय) के आधार पर आदेश दिया जाता है।
खाते में req और res ऑब्जेक्ट्स श्रृंखला के माध्यम से यात्रा कर रहे हैं ताकि आप चेन के साथ डेटा में पुन: उपयोग/सुधार/संशोधित कर सकें। सामान्य और विशिष्ट:

मिडलवेयर के लिए दो सामान्य उपयोग के मामलों रहे हैं।

जेनेरिक जैसा आपने ऊपर उदाहरण में परिभाषित किया है: app.use, यह प्रत्येक अनुरोध पर लागू होगा। प्रत्येक मिडलवेयर को next() को कॉल करना होगा, अगर वह अगले मिडलवेयर पर आगे बढ़ना चाहता है।

जब आप app.get('/path', function(... का उपयोग करते हैं तो यह वास्तविक फ़ंक्शन मिडलवेयर भी है, केवल इनलाइन परिभाषित किया गया है। तो यह पूरी तरह से मध्यवर्ती पर आधारित है, और endware नहीं है: डी

श्रृंखला आदेश परिभाषा आदेश पर आधारित है। तो मिडलवेयर को सिंक तरीके या ऑर्डर-विश्वसनीय एसिंक तरीके से परिभाषित करना महत्वपूर्ण है। अन्यथा मिडलवेयर का अलग-अलग क्रम तर्क तोड़ सकता है, जब मिडलवेयर की श्रृंखला एक-दूसरे पर निर्भर करती है।

चेन return next(new Error()); श्रृंखला को तोड़ने के लिए कुछ मिडलवेयर का उपयोग किया जा सकता है।उदाहरण के लिए यह प्रमाणीकरण या प्रमाणीकरण मिडलवेयर के लिए उपयोगी है।
मिडलवेयर के लिए उपयोग का एक और उपयोगी पैटर्न प्रक्रिया डेटा, जैसे कुकीज़, या app.use(express.bodyParser()); का अच्छा उदाहरण है, को संसाधित करना और पार्स करना है।

+0

तो अगर मेरे पास 'var ए = आवश्यकता ('./ ए'), बी = आवश्यकता ('./ बी'); app.use (ए()); ऐप.यूज (बी()); 'फिर 'ए'' बी' से पहले आएगा, 'ए' के ​​'अगले' आविष्कार 'बी' के साथ? क्या पैरामीटर फिर से पारित हो जाते हैं? अन्यथा 'बी' पहुंच 'req, res, ect' कैसे होगी? – gone

+0

बिल्कुल। 'req' और' res' ऑब्जेक्ट्स यात्रा कर रहे हैं और सभी श्रृंखला में एक ही ऑब्जेक्ट है। इस तरह आप इसमें कुछ डेटा सहेज सकते हैं, और उसके बाद श्रृंखला के साथ बाद में इसे किसी अन्य मिडलवेयर में पुन: उपयोग कर सकते हैं। यह वास्तव में 'req' में आपके अधिकांश डेटा के साथ होता है। उदाहरण के लिए डिफ़ॉल्ट POST बॉडी डेटा को पार्स नहीं किया गया है और 'express.bodyParser()' मिडलवेयर इसे पार्स करेगा, और आपके पास बाद में श्रृंखला में इसका उपयोग होगा। – moka

+0

कूल! जवाब के लिए धन्यवाद! – gone

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