2014-11-25 21 views
14

मैं अन्य सूक्ष्म सेवाओं के सामने एक फ़ायरवॉल/डिस्पैचर की तरह बैठे एक नोड एप्लिकेशन है, से मार्ग को शामिल न करें और इसके नीचे की तरह एक मिडलवेयर श्रृंखला का उपयोग करता है:एक्सप्रेस मिडलवेयर

... 
app.use app_lookup 
app.use timestamp_validator 
app.use request_body 
app.use checksum_validator 
app.use rateLimiter 
app.use whitelist 
app.use proxy 
... 
हालांकि एक विशेष प्राप्त मार्ग मैं चाहता हूँ के लिए

रेटिमीटर और प्रॉक्सी को छोड़कर उन सभी को छोड़ दें। क्या इसका उपयोग रेल से पहले फ़िल्टर करने के लिए पहले से सेट करने का तरीका है: सिवाय इसके कि: केवल?

+3

आप इस उद्देश्य के लिए उपयोगकर्ता को 'व्यक्त-रहित' एनपीएम कर सकते हैं। –

उत्तर

41

हालांकि एक्सप्रेसज में कोई बिल्ड-इन मिडलवेयर फ़िल्टर सिस्टम नहीं है, आप इसे कम से कम दो तरीकों से प्राप्त कर सकते हैं।

सबसे पहले विधि सभी middlewares कि आप एक नियमित अभिव्यक्ति पथ के लिए छोड़ना चाहते माउंट करने के लिए की तुलना में एक नकारात्मक देखने भी शामिल है:

// Skip all middleware except rateLimiter and proxy when route is /example_route 
app.use(/\/((?!example_route).)*/, app_lookup); 
app.use(/\/((?!example_route).)*/, timestamp_validator); 
app.use(/\/((?!example_route).)*/, request_body); 
app.use(/\/((?!example_route).)*/, checksum_validator); 
app.use(rateLimiter); 
app.use(/\/((?!example_route).)*/, whitelist); 
app.use(proxy); 

दूसरी विधि, शायद अधिक पठनीय और क्लीनर एक, के साथ अपने मिडलवेयर रैप करने के लिए है एक छोटा सा सहायक समारोह:

var unless = function(path, middleware) { 
    return function(req, res, next) { 
     if (path === req.path) { 
      return next(); 
     } else { 
      return middleware(req, res, next); 
     } 
    }; 
}; 

app.use(unless('/example_route', app_lookup)); 
app.use(unless('/example_route', timestamp_validator)); 
app.use(unless('/example_route', request_body)); 
app.use(unless('/example_route', checksum_validator)); 
app.use(rateLimiter); 
app.use(unless('/example_route', whitelist)); 
app.use(proxy); 

आप सरल path === req.path की तुलना में अधिक शक्तिशाली मार्ग मिलान की जरूरत है आप path-to-regexp module है कि एक्सप्रेस द्वारा आंतरिक रूप से प्रयोग किया जाता है का उपयोग कर सकते हैं।

+0

सुविधाजनक, लेकिन सरल कार्य। धन्यवाद! –

7

तुम भी req.originalUrl पर एक शर्त रख कर इस तरह मार्ग को छोड़ कर सकते हैं:

app.use(function (req, res, next) { 

    if (req.originalUrl === '/api/login') { 
    return next(); 
    } else { 
     //DO SOMETHING 
    } 
3

मैं सफलता के साथ इस रेगुलर एक्सप्रेशन का उपयोग: /^\/(?!path1|pathn).*$/

1

आप नीचे दिए गए कुछ मार्गों को परिभाषित कर सकते हैं।

app.use(/\/((?!route1|route2).)*/, (req, res, next) => { 

    //A personal middleware 
    //code 

    next();//Will call the app.get(), app.post() or other 
}); 
+0

हैलो, कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें और अपने कोड को स्वरूपित करें। अधिक जानकारी के लिए कृपया https://stackoverflow.com/help/formatting देखें। – Chaithanya

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