2013-09-03 11 views
17

क्या स्टैक से app.use के साथ जोड़ा गया मिडलवेयर निकालने का एक कैननिक तरीका है? ऐसा लगता है कि यह should be possible to just modify the app.stack array directly है, लेकिन मुझे आश्चर्य है कि क्या एक दस्तावेज विधि है जिसे मुझे पहले विचार करना चाहिए।एक्सप्रेस स्टैक से मिडलवेयर को हटाने का सही तरीका?

+0

* उचित * तरीका अवांछित मिडलवेयर जोड़ने के लिए नहीं है। – elmigranto

+0

@ एल्मिग्रेंटो यह एक अत्यधिक सरल दृष्टिकोण है। ऐसे कई कारण हैं जिनसे आप अधिक गतिशील तरीके से एक्सप्रेस रूटिंग का उपयोग करना चाह सकते हैं, जिसके लिए कुछ मामलों में मिडलवेयर जोड़ने/हटाने की आवश्यकता हो सकती है। – Brad

+0

मिडलवायर स्टैक ऐप में है ._router.stack – rocketspacer

उत्तर

17

use वास्तव में कनेक्ट (एक्सप्रेस नहीं), और all it really does is push the middleware function onto the app's stack से आता है।

तो आपको सरणी के बाहर फ़ंक्शन को ठीक से विभाजित करना चाहिए।

हालांकि, ध्यान रखें कि app.stack के आसपास कोई दस्तावेज नहीं है और न ही मिडलवेयर को निकालने के लिए कोई फ़ंक्शन है। आप कनेक्ट कोड परिवर्तन के भविष्य के संस्करण का जोखिम अपने कोड के साथ असंगत चलाते हैं।

+3

या 'एक्सप्रेस' आपके कोड के साथ असंगत परिवर्तन कर रहा है। 'एक्सप्रेस' अब' कनेक्ट 'पर निर्भर नहीं है, इसलिए मुझे नहीं लगता कि यह अब और काम करता है। – trysis

2

ऐसा करने के लिए कोई रास्ता नहीं बनाया गया है, लेकिन आप एक छोटी सी चाल के साथ एक ही परिणाम प्राप्त कर सकते हैं। मिडलवेयर की अपनी खुद की सरणी बनाएं (चलो इसे dynamicMiddleware पर कॉल करें) लेकिन इसे एक्सप्रेस में धक्का न दें, इसके बजाय केवल 1 मिडलवेयर दबाएं जो सभी हैंडलर को dynamicMiddleware में अतुल्यकालिक रूप से निष्पादित करेगा और क्रम में। सरणी के माध्यम से है कि वसीयत पाश 1 मिडलवेयर में सभी गतिशील संचालकों सरणी लपेट,: के रूप में मैं इसे अभी परीक्षण करने के लिए एक मौका नहीं है, लेकिन विचार स्पष्ट किया जाना चाहिए

const async = require('async') 

// Middleware 
const m1 = (req, res, next) => { 
    // do something here 
    next(); 
} 

const m2 = (req, res, next) => { 
    // do something here 
    next(); 
} 

const m3 = (req, res, next) => { 
    // do something here 
    next(); 
} 

let dynamicMiddleware = [m1, m2, m3] 

app.use((req, res, next) => { 
    // execute async handlers one by one 
    async.eachSeries(
     // array to iterate over 
     dynamicMiddleware, 
     // iteration function 
     (handler, callback) => { 
      // call handler with req, res, and callback as next 
      handler(req, res, callback) 
     }, 
     // final callback 
     (err) => { 
      if(err) { 
      // handle error as needed 

      } else { 
       // call next middleware 
       next() 
      } 
     } 
    ); 
}) 

कोड थोड़ा किसी न किसी तरह है। और जैसे ही आप सरणी में हैंडलर जोड़ते हैं या हटाते हैं, केवल सरणी में छोड़े गए ही कॉल किए जाएंगे।

+0

यह आवश्यक समस्या को हल नहीं करता है। कम से कम मेरे उपयोग मामले में, माउंट पॉइंट्स और विधियों के विभिन्न हैंडलिंग होने के लिए महत्वपूर्ण है। ऐसा लगता है कि आंतरिक ढेर को संशोधित करना अभी भी संभव है, इसे बस थोड़ा सा स्थानांतरित कर दिया गया है। – Brad

+0

क्या आप कृपया अपने उपयोग के मामले को अधिक विस्तार से स्पष्ट कर सकते हैं। शायद आप इसे एक छोटे से मॉड्यूल में लपेट सकते हैं और अलग-अलग बढ़ते बिंदुओं पर पुन: उपयोग कर सकते हैं? – Gaafar

-1

जहां तक ​​मुझे पता है कि एक मिडलवेयर हटाने का कोई तरीका नहीं है। हालांकि, आप किसी भी समय किसी भी समय मिडलवेयर को 'निष्क्रिय' करने के लिए एक बूलियन ध्वज असाइन कर सकते हैं।

var middlewareA_isActivate = true; 
//Your middleware code 
function(req, res, next) { 
    if (!middlewareA_isActivate) next(); 
    //......... 
} 
//Deactivate middleware 
middlewareA_isActivate = false; 

संपादित करें:
के माध्यम से ExpressJs (4.x) कोड को पढ़ने के बाद, मैं तुम्हें उपयोग कर सकते हैं कि middlewares app._router.stack के माध्यम से ढेर नोटिस, जोड़-तोड़ वहां से चला जाता है मुझे लगता है कि। फिर भी, मुझे लगता है कि यह 'चाल' भविष्य में काम करने में सक्षम नहीं हो सकता है
पी/एस: परीक्षण नहीं किया गया है कि एक्सप्रेस कैसे व्यवहार करता है जब मध्यवर्ती ढेर सीधे चिपकते हैं

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