2012-12-03 16 views
5

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

उत्तर

9

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

app.js

var app = express(); 
// ... 

app.use(express.logger()); // first middleware function 

var someOtherModule = require('./mod.js'); 
someOtherModule.init(app); 

app.use(express.static()); // last middleware function) 

mod.js

exports.init = function(app) { 
    app.use(function(req, res, next) { 

    }); 
}; 

जहां तक ​​वास्तव में इंजेक्शन लगाने ढेर के बीच में एक मध्यस्थ के समारोह (के बाद आप पहले से ही कहा है app.use मिडलवेयर कार्यों के एक सेट के साथ), ऐसा करने के लिए कोई दस्तावेज तरीका नहीं है। use केवल स्टैक के अंत में एक फ़ंक्शन जोड़ता है।

use वास्तव में proto.js में बंधन द्वारा आपूर्ति की है:

app.use = function(route, fn){ 

    ... 

    this.stack.push({ route: route, handle: fn }); 

    return this; 
}; 

तकनीकी तौर पर, आप अपने आप को app.stack के साथ बेला सकता है, लेकिन मैं इस नहीं मारूंगा। आप एक अनियंत्रित कार्यान्वयन विस्तार से गड़बड़ कर रहे होंगे, जो बदलने के लिए उत्तरदायी है। दूसरे शब्दों में, यह संभव है कि पर भविष्य का अपडेट कनेक्ट या एक्सप्रेस आपके ऐप को तोड़ सकता है।

+0

के साथ सभी जोड़ें धन्यवाद - मुझे नहीं लगता था कि एक रास्ता था (यह कहने का एक आसान तरीका नहीं है कि इसे कहां रखा जाएगा)।मैं शायद आगे बढ़ने के तरीके के साथ जाने जा रहा हूं। – MrPurpleStreak

+0

यह इंगित करने के लिए भारी जीत है कि आदेश महत्वपूर्ण है! धन्यवाद! – JWally

0

मुझे समझ में नहीं आता कि समस्या क्या है?

आप मिडलवेयर में किसी भी समारोह में जोड़ सकते हैं:

app.use(function(req,res,next){ 
    //some munipulation with req and res 
    next() 
}) 

और तुम में आप कर रहे हैं moduls

+1

मुझे लगता है कि समस्या यह है कि 'app.use' हमेशा ढेर के अंत * करने के लिए अपने मिडलवेयर समारोह * कहते है, इसलिए मिडलवेयर पहले जोड़ा अनुरोध को पूरा कर सकते हैं इससे पहले कि आप कार्य करते हैं चलाने के लिए एक मौका हो जाता है। – josh3736

+0

उदाहरण के लिए? इसकी आवश्यकता कब है? –

+0

चीजों को अधिक मॉड्यूलर रखने और रखने के लिए - इसलिए मैं सब कुछ प्रमाणीकरण के साथ प्रमाणीकरण के साथ करना चाहता हूं - यह वहां के पास पासपोर्ट ऑब्जेक्ट बनाता है ताकि इसे पास करने के बजाय मैं ऐप को पास कर दूंगा और केट कि मॉड्यूल पासपोर्ट जोड़ता है। express.session के बाद प्रारंभ करें और passport.session मिडलवेयर लेकिन राउटर – MrPurpleStreak

1

आप app.use (एफ एन) का उपयोग कर सकते हैं या उन्हें इस तरह ढेर:

app.get('/foo', fn1, fn2, fn3); 

हस्ताक्षर हमेशा एक ही हो सकता है और अगले फोन() के लिए है;

function(req, res, next) { 
    next(); 
} 
संबंधित मुद्दे