क्या Node.JS एक्सप्रेस में app.all('*', ... )
और इसके बीच एक उपयोगी अंतर है app.use('/', ...)
?
क्या Node.JS एक्सप्रेस में app.all('*', ... )
और इसके बीच एक उपयोगी अंतर है app.use('/', ...)
?
जवाबों:
ज्यादातर मामलों में वे बराबर काम करेंगे। सबसे बड़ा अंतर वह क्रम है जिसमें मिडलवेयर लागू किया जाएगा:
app.all()
एप्लिकेशन के राउटर से जुड़ जाता है, इसलिए जब भी ऐप का उपयोग किया जाता है। मिडलवेयर पहुंच जाता है (जो सभी विधि मार्गों को संभालता है ... GET, POST, आदि)।सूचना: app.router व्यक्त 4.x में पदावनत किया गया है
app.use()
अनुप्रयोग के मुख्य मिडलवेयर स्टैक से जुड़ता है, इसलिए इसे मिडलवेयर द्वारा निर्दिष्ट क्रम में उपयोग किया जाता है। उदाहरण के लिए, यदि आप इसे पहले डालते हैं, तो यह पहली चीज होगी। यदि आप इसे अंतिम रूप से रखते हैं, (राउटर के बाद), तो यह आमतौर पर चलाया नहीं जाएगा।आमतौर पर, यदि आप सभी मार्गों पर विश्व स्तर पर कुछ करना चाहते हैं, तो app.use () बेहतर विकल्प है। इसके अलावा, इसमें भविष्य के बग की संभावना कम है, क्योंकि एक्सप्रेस 0.4 संभवतः अंतर्निहित राउटर को छोड़ देगा (मतलब, मिडिलवेयर में राउटर की स्थिति अभी की तुलना में अधिक महत्वपूर्ण होगी, क्योंकि आपको तकनीकी रूप से भी इसका उपयोग करने की आवश्यकता नहीं है। अभी)।
next("route")
साथ उपयोग कर सकते हैं app.all
, लेकिन साथ नहीं app.use
।
app.use केवल एक कॉलबैक फ़ंक्शन लेता है और यह मिडलवेयर के लिए है। मिडलवेयर आमतौर पर अनुरोध और प्रतिक्रिया को संभाल नहीं पाता है, (तकनीकी रूप से वे कर सकते हैं) वे इनपुट डेटा को संसाधित करते हैं, और कतार में अगले हैंडलर को सौंप देते हैं।
app.use([path], function)
app.all कई कॉलबैक लेता है, और रूटिंग के लिए था। कई कॉलबैक के साथ आप अनुरोधों को फ़िल्टर कर सकते हैं और प्रतिक्रियाएं भेज सकते हैं। एक्सप्रेस में इसके फिल्टर पर समझाया। js
app.all(path, [callback...], callback)
app.use केवल यह बताता है कि url निर्दिष्ट पथ से शुरू होता है या नहीं
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.all पूर्ण पथ से मेल खाएगा
app.all( "/product" , handler);
// will match /product
// won't match /product/cool <-- important
// won't match /product/foo <-- important
app.all( "/product/*" , handler);
// won't match /product <-- Important
// will match /product/
// will match /product/cool
// will match /product/foo
app.use:
app.all:
इस व्यक्तJJ कोड नमूना देखें:
var express = require('express');
var app = express();
app.use(function frontControllerMiddlewareExecuted(req, res, next){
console.log('(1) this frontControllerMiddlewareExecuted is executed');
next();
});
app.all('*', function(req, res, next){
console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
next();
});
app.all('/hello', function(req, res, next){
console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
next();
});
app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
next();
});
app.get('/hello', function(req, res){
console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
res.send('Hello World');
});
app.listen(80);
यहां मार्ग / 'हेलो' को एक्सेस करते समय लॉग होता है:
(1) this frontControllerMiddlewareExecuted is executed
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response
के साथ app.use()
, "माउंट" पथ छीन लिया गया है और मिडलवेयर फ़ंक्शन के लिए दृश्यमान नहीं है:
app.use('/static', express.static(__dirname + '/public'));
माउंट किए गए मिडलवेयर फ़ंक्शंस ( express.static
) को तब तक लागू नहीं किया जाता है जब तक कि req.url
इस उपसर्ग ( /static
) में शामिल न हों , जिस समय यह फ़ंक्शन लागू किया जाता है, तब इसे छीन लिया जाता है।
के साथ app.all()
, वह व्यवहार नहीं है।
app.all()
जब किसी विशेष प्रकार के अनुरोध विधि (POST, GET, PUT, या DELETE) के साथ अनुरोध किया जाता है , तो हाँ कहलाता है
दूसरी ओर app.use()
आपके किसी भी मिडलवेयर के लिए उपयोग किया जाता है और यह एक पथ उपसर्ग पर mounts, और कभी भी उस मार्ग के तहत एक URI का अनुरोध किया जाता है।
यहाँ app.all और app.use के लिए प्रलेखन है ।
उपर्युक्त सभी उत्तरों में दो अंतर नहीं हैं।
फ़िसर्ट वन: app.all
एक रेगेक्स को इसके पथ पैरामीटर के रूप में स्वीकार करता है। app.use
रेगेक्स स्वीकार नहीं करता है।
दूसरा एक:
app.all(path,handler)
या app[method](path,handler)
, हैंडलर का सभी केpath
लिए समान होना चाहिए । यह, ऐप [विधि] का पथ पूरा है। path
app.use(path,hanlder)
, यदि उपयोग का पथ पूरा हो गया है, तो हैन्ल्डर का पथ '/' होना चाहिए। यदि उपयोग का पथ पूर्ण पथ का प्रारंभ है, तो हैंडलर पथ का पूर्ण पथ शेष होना चाहिए।
app.use('/users', users);
//users.js: the handler will be called when matchs `/user/` path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
// others.js: the handler will be called when matchs `/users/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
app.all('/users', users);
//others.js: the handler wil be called when matchs `/`path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
//users.js: the handler will be called when matchs `/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
दो मुख्य अंतर हैं:
1. पैटर्न मिलान (पलानी द्वारा दिया गया उत्तर)
2. next(route)
उपयोग किए गए मिडलवेयर के फ़ंक्शन बॉडी के अंदर काम नहीं करेगा app.use
। यह डॉक्स के लिंक में कहा गया है:
NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.
लिंक: http://expressjs.com/en/guide/use-middleware.html
next('route')
निम्नलिखित उदाहरण से काम के प्रभाव को देखा जा सकता है:
app.get('/',
(req,res,next)=>{console.log("1");
next(route); //The code here skips ALL the following middlewares
}
(req,res,next)=>{next();}, //skipped
(req,res,next)=>{next();} //skipped
);
//Not skipped
app.get('/',function(req,res,next){console.log("2");next();});