2012-06-30 26 views
9

मैं express.js/node.js सीख रहा हूं और जावास्क्रिप्ट प्रोटोटाइप मॉडल की अच्छी लेकिन उत्कृष्ट समझ नहीं है। इसलिए, मैं एक्सप्रेस.जेएस के रूटिंग तंत्र में मिडलवेयर को ढंका जा सकता है जिस तरह से थोड़ा उलझन में हूं।express.js में मिडलवेयर कार्यों का दायरा

, कहो के बाद से andRestrictTo (भूमिका) एक मिडलवेयर रिटर्न हम इस code

function andRestrictTo(role) { 
    return function(req, res, next) { 
     req.authenticatedUser.role == role 
      ? next() : next(new Error('Unauthorized')); 
    } 
} 

app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){ 
    res.send('Deleted user ' + req.user.name); 
}); 

है इसे पाने के मार्ग श्रृंखला में मार डाला - मुझे लगता है कि मिल गया। हालांकि:

  1. req, res, अगले पैरामीटर लौटाए गए फ़ंक्शन में कहां से आते हैं? मुझे लगता है कि "श्रृंखला" किसी भी तरह से इसे कतारबद्ध करती है और पैरामीटर को मानती है, लेकिन यह गहरी समझ के लिए थोड़ा अस्पष्ट है ...

  2. अगले पैरामीटर के रूप में उठाए गए त्रुटि के साथ क्या हो रहा है? क्या कोई त्रुटि बस मिडलवेयर श्रृंखला को तोड़ती है?

  3. यदि मैं एक अलग फ़ाइल/मॉड्यूल (सुरक्षा ढांचे की तरह) प्रतिबंध तंत्र को पैकेज करना चाहता हूं, तो यह कैसे किया जाएगा?

यह शांत हो सकता है अगर किसी को मूल विचार :) बाहर बिंदु सकता

उत्तर

9

1) req और res एक्सप्रेस जे एस के बहुत स्रोत है, यानी Node.js http.createServer हैंडलर से आते हैं (दोनों चर वास्तव में एक्सप्रेस 'हैंडलर मार) से पहले थोड़ा संशोधित कर रहे हैं। उस बिंदु पर एक्सप्रेस सभी मार्गों की सरणी रखता है और प्रत्येक मार्ग पर req, res और next फ़ंक्शन लागू करता है। next फ़ंक्शन जानता है कि इस समय कौन सा मिडलवेयर हम हैं (कुछ स्कोपिंग चाल के कारण) और इसे इस तरह कॉल करना: next() आपको अगले हैंडलर पर ले जाता है।

2) जब त्रुटि उठाया है (वास्तव में नहीं उठाया है, लेकिन करने के लिए पारित कर दिया), next समारोह त्रुटि हैंडलर है, जो आप app की error पद्धति का उपयोग करके परिभाषित कर सकते हैं, उदाहरण के लिए (Express documentation से लिया पर ले जाता है) :

app.error(function(err, req, res, next){ 
    if (err instanceof NotFound) { 
     res.render('404.jade'); 
    } else { 
     next(err); 
    } 
}); 

error स्थापना middlewares की एक श्रृंखला breakes और त्रुटि संचालकों की श्रृंखला पर ले जाता है (जैसा कि आप देख सकते हैं, आप के रूप में अच्छी त्रुटि संचालकों में next उपयोग करें)।

3) बिल्कुल नहीं मुश्किल:

security.js

module.exports = function(req, res, next) { 
    console.log('Security middleware!'); 
    next(); 
} 

app.js

app.get('/', require('./security'), ...); 
1

1) एक्सप्रेस के (वास्तव में कनेक्ट के) रूटिंग कोड बुला एक HTTP अनुरोध लेता है और सभी मिडलवेयर कार्यों के साथ इसे पारित शुरू होता है, उनमें से प्रत्येक req और res के साथ अनुरोध के साथ आया था, और next जोड़ रहा है जो श्रृंखला में अगले मध्यवर्ती फ़ंक्शन के साथ नियंत्रण पास करने वाले रूटिंग कोड के हिस्से को आमंत्रित करता है।

2) कोई त्रुटि नहीं उठाई गई है (केवल throw कथन वास्तव में एक त्रुटि उठा सकता है)। रूटिंग कोड पहचानता है कि एक मिडलवेयर फ़ंक्शन ने Error ऑब्जेक्ट वापस कर दिया है, और उचित तरीके से संबंधित है।

3) तुम सिर्फ एक मॉड्यूल है कि andRestrict निर्यात करता है (अगर यह मॉड्यूल में केवल बाहरी रूप से प्रयोग करने योग्य समारोह थे, तो आप exports=andRestrict सेट और फिर require('mymodule') साथ यह आह्वान हैं) रख दिया था; अन्यथा आप exports.andRestrict=<body of your function> सेट करेंगे और इसे दो चरणों में आमंत्रित करेंगे: mymodule=require('mymodule') बाद में, और mymodule.andRestrict बाद में (उदा। इसे मिडलवेयर के रूप में पास करते समय))।