App.all ('*') और app.use ('/') के बीच अंतर


121

क्या Node.JS एक्सप्रेस में app.all('*', ... )और इसके बीच एक उपयोगी अंतर है app.use('/', ...)?

जवाबों:


119

ज्यादातर मामलों में वे बराबर काम करेंगे। सबसे बड़ा अंतर वह क्रम है जिसमें मिडलवेयर लागू किया जाएगा:

  • app.all() एप्लिकेशन के राउटर से जुड़ जाता है, इसलिए जब भी ऐप का उपयोग किया जाता है। मिडलवेयर पहुंच जाता है (जो सभी विधि मार्गों को संभालता है ... GET, POST, आदि)।

सूचना: app.router व्यक्त 4.x में पदावनत किया गया है

  • app.use()अनुप्रयोग के मुख्य मिडलवेयर स्टैक से जुड़ता है, इसलिए इसे मिडलवेयर द्वारा निर्दिष्ट क्रम में उपयोग किया जाता है। उदाहरण के लिए, यदि आप इसे पहले डालते हैं, तो यह पहली चीज होगी। यदि आप इसे अंतिम रूप से रखते हैं, (राउटर के बाद), तो यह आमतौर पर चलाया नहीं जाएगा।

आमतौर पर, यदि आप सभी मार्गों पर विश्व स्तर पर कुछ करना चाहते हैं, तो app.use () बेहतर विकल्प है। इसके अलावा, इसमें भविष्य के बग की संभावना कम है, क्योंकि एक्सप्रेस 0.4 संभवतः अंतर्निहित राउटर को छोड़ देगा (मतलब, मिडिलवेयर में राउटर की स्थिति अभी की तुलना में अधिक महत्वपूर्ण होगी, क्योंकि आपको तकनीकी रूप से भी इसका उपयोग करने की आवश्यकता नहीं है। अभी)।


15
क्या यह अभी भी एक्सप्रेस 4.x के बाद लागू होता है? app.router हटा दिया गया था।
रफ्री

1
आप के next("route")साथ उपयोग कर सकते हैं app.all, लेकिन साथ नहीं app.use
जोज़ेफ़ मिकुसिनेक

@JozefMikusinec डॉक्युमेंटेशन में सुझाव दिया गया है अन्यथा लगता है ... expressjs.com/en/guide/writing-middleware.html
musicin3d

आपके लिंक में अगले ('मार्ग') का उल्लेख नहीं है, लेकिन मैंने एपीआई को देखा, आप सही हैं।
जोज़ेफ मिकुसिनेक

2
@ musicin3d मैंने आगे शोध किया और इस GitHub मुद्दे को पाया , जो इस बात की पुष्टि करता है कि "अगला () और अगला ('मार्ग') app.use में कोई अंतर नहीं है" (उद्धरण)। उन्हें डॉक्स को बदलना चाहिए।
जोज़ेफ़ मिकुसिनेक

87

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

17
कम से कम v4 में, app.use एक या अधिक मिडलवेयर फ़ंक्शंस लेता है , न कि "केवल एक"।
जेस ऑस्टिन

2
app.use केवल यह देखें कि url निर्दिष्ट पथ से शुरू होता है या नहीं, app.all पूर्ण पथ से मेल खाएगा। यह मुख्य अंतर है।
meizilp

@frogcjn नहीं, यह नहीं होना चाहिए क्योंकि यह मेरे प्रश्न में * और / की उपेक्षा करता है।
14

15
  • app.use:

    1. उदाहरण के लिए कॉन्फ़िगर करने वाले अपने फ्रंट कंट्रोलर को मिडलवेयर इंजेक्ट करें: हेडर, कुकीज, सेशन इत्यादि।
    2. एप्लिकेशन [http_method] से पहले लिखा जाना चाहिए अन्यथा वहाँ निष्पादित नहीं किया जाएगा।
    3. लिखने के क्रम में कई कॉल संसाधित किए जाते हैं
  • app.all:

    1. (जैसे ऐप [http_method]) का उपयोग मार्गों के नियंत्रकों को कॉन्फ़िगर करने के लिए किया जाता है
    2. "सभी" का अर्थ है कि यह सभी http तरीकों पर लागू होता है।
    3. लिखने के क्रम में कई कॉल संसाधित किए जाते हैं

इस व्यक्त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

6
एक्सप्रेस 4.x पर इस उदाहरण वर्बेटिम को चलाने के बाद, यह वास्तव में सभी 5 क्रम में चलता है। ऐसा लिखे जाने के बाद से लगभग 3 वर्षों में एक्सप्रेस में बदलाव के कारण यह संभव है, लेकिन मुझे लगा कि मैं स्पष्टता के लिए इसे जोड़ूंगा।
नाथन वाइब

11

के साथ app.use(), "माउंट" पथ छीन लिया गया है और मिडलवेयर फ़ंक्शन के लिए दृश्यमान नहीं है:

app.use('/static', express.static(__dirname + '/public'));

माउंट किए गए मिडलवेयर फ़ंक्शंस ( express.static) को तब तक लागू नहीं किया जाता है जब तक कि req.urlइस उपसर्ग ( /static) में शामिल न हों , जिस समय यह फ़ंक्शन लागू किया जाता है, तब इसे छीन लिया जाता है।

के साथ app.all(), वह व्यवहार नहीं है।


प्रश्न केवल app.use ('/', ...) के बारे में स्पष्ट रूप से पूछें।
इस्टरगार्ड

यह प्रश्न का सही उत्तर है जो अभी भी 2018 में सच है! एक मिडलवेयर को सभी के साथ माउंट किया जा सकता है () भी ... फर्क सिर्फ इतना है कि मिडलवेयर को निष्पादित करते समय माउंट रास्ता छीन लिया जाता है।
जतिन

4

app.all()जब किसी विशेष प्रकार के अनुरोध विधि (POST, GET, PUT, या DELETE) के साथ अनुरोध किया जाता है , तो हाँ कहलाता है

दूसरी ओर app.use()आपके किसी भी मिडलवेयर के लिए उपयोग किया जाता है और यह एक पथ उपसर्ग पर mounts, और कभी भी उस मार्ग के तहत एक URI का अनुरोध किया जाता है।

यहाँ app.all और app.use के लिए प्रलेखन है ।


धन्यवाद, लेकिन मुझे लगता है कि आप app.all वाइल्डकार्ड और app.use रूट पथ को याद किया जो उन्हें बहुत ज्यादा वही बनाते हैं जो वे नहीं करते हैं? सिवाय उस app.all के कॉलबैक की एक सरणी ले सकते हैं और app.use केवल एक - सही ले सकते हैं?
ostergaard

1

उपर्युक्त सभी उत्तरों में दो अंतर नहीं हैं।

फ़िसर्ट वन: 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');
 });

0

दो मुख्य अंतर हैं:

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();});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.