App.use और app.get के बीच अंतर। express में


220

मैं व्यक्त और नोड.जेएस के लिए नया हूं, और मैं app.use और app.get के बीच अंतर का पता नहीं लगा सकता। ऐसा लगता है कि आप जानकारी भेजने के लिए दोनों का उपयोग कर सकते हैं। उदाहरण के लिए:

app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

ऐसा ही प्रतीत होता है:

app.get('/', function (req,res) {
   res.send('Hello');
});

1
लगता है कि आपको तीन अलग-अलग उत्तर मिले, सभी विषय में कुछ योगदान दे रहे हैं :) यहाँ एक संबंधित प्रश्न है stackoverflow.com/questions/11321635/…
बेंजामिन ग्रुएनबाम

हाँ, सभी अच्छे उत्तर। धन्यवाद, मैं उस पर एक नज़र डालूंगा।
आंद्रे वोरोब्योव

जवाबों:


219

app.use()आपके एप्लिकेशन के लिए मिडिलवेयर को बाइंड करने का इरादा है । pathएक "है माउंट " या " उपसर्ग " पथ और मिडलवेयर के लिए एक ही पथ पर लागू होते हैं अनुरोध किया है कि सीमित करता है शुरू इसके साथ। इसका उपयोग किसी अन्य एप्लिकेशन को एम्बेड करने के लिए भी किया जा सकता है:

// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();

app.use('/subapp', require('./subapp'));

// ...

/" माउंट " पथ के रूप में निर्दिष्ट करके , app.use()उस किसी भी पथ पर प्रतिक्रिया देगा /जो इसके साथ शुरू होता है , जो कि उन सभी में से हैं और चाहे वे HTTP वर्ब के हैं:

  • GET /
  • PUT /foo
  • POST /foo/bar
  • आदि।

app.get()दूसरी ओर, एक्सप्रेस ' एप्लिकेशन रूटिंग का हिस्सा है और GETHTTP वर्जन के साथ अनुरोध किए जाने पर एक विशिष्ट मार्ग से मेल खाने और संभालने के लिए है।

  • GET /

और, आपके उदाहरण के समतुल्य रूटिंग app.use()वास्तव में होगी:

app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});

( अपडेट: मतभेदों को बेहतर ढंग से प्रदर्शित करने का प्रयास करना। )

रूटिंग विधियाँ, सहित app.get(), सुविधा विधियाँ हैं जो आपको अधिक सटीक अनुरोधों के लिए प्रतिक्रियाओं को संरेखित करने में मदद करती हैं। वे मापदंडों और जैसी सुविधाओं के लिए समर्थन में भी जोड़ते हैं next('route')

प्रत्येक के भीतर app.get()एक कॉल है app.use(), तो आप निश्चित रूप से app.use()सीधे के साथ यह सब कर सकते हैं। लेकिन, ऐसा करने के लिए अक्सर बॉयलरप्लेट कोड की विभिन्न मात्राओं को फिर से लागू करना होगा (शायद अनावश्यक रूप से)।

उदाहरण:

  • सरल, स्थिर मार्गों के लिए:

    app.get('/', function (req, res) {
      // ...
    });

    बनाम

    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      // ...
    });
  • एक ही मार्ग के लिए कई हैंडलर के साथ:

    app.get('/', authorize('ADMIN'), function (req, res) {
      // ...
    });

    बनाम

    const authorizeAdmin = authorize('ADMIN');
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      authorizeAdmin(req, res, function (err) {
        if (err) return next(err);
    
        // ...
      });
    });
  • मापदंडों के साथ:

    app.get('/item/:id', function (req, res) {
      let id = req.params.id;
      // ...
    });

    बनाम

    const pathToRegExp = require('path-to-regexp');
    
    function prepareParams(matches, pathKeys, previousParams) {
      var params = previousParams || {};
    
      // TODO: support repeating keys...
      matches.slice(1).forEach(function (segment, index) {
        let { name } = pathKeys[index];
        params[name] = segment;
      });
    
      return params;
    }
    
    const itemIdKeys = [];
    const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET') return next();
    
      var urlMatch = itemIdPattern.exec(req.url);
      if (!urlMatch) return next();
    
      if (itemIdKeys && itemIdKeys.length)
        req.params = prepareParams(urlMatch, itemIdKeys, req.params);
    
      let id = req.params.id;
      // ...
    });

नोट: इन सुविधाओं का एक्सप्रेस 'कार्यान्वयन इसके और Router,LayerRoute में निहित हैं ।


3
एम्बेडेड एप्लिकेशन का उल्लेख करने के लिए यश। यह एक्सप्रेस मिडलवेयर को व्यवस्थित करने का बहुत आसान तरीका है।
wprl

4
क्या यह कहना उचित है कि app.use प्रत्येक में से प्रत्येक app.get, app.post, app.put कर सकता है लेकिन इसके विपरीत नहीं?
ngungo

6
अभी भी समझना मुश्किल है।
Jeb50

1
यह जानना अच्छा है कि उपयोग क्या है और इसके लिए क्या है , लेकिन कोई भी यह समझाने का एक बड़ा काम नहीं करता है कि वे कैसे अलग तरीके से कार्य करते हैं। मैं क्या इकट्ठा कर सकते हैं से, सभी .use संचालकों पहले चलाने के लिए, और किसी भी रास्ता है कि .use से मेल खाता है शुरू होता है निर्दिष्ट पथ के साथ (यानी .use ( '/', ...) और .Get ( '/ *', ... ) समान रास्तों से मेल खाएगा)। मेरे लिए समग्र अवधारणाओं को समझना आसान है जब मैं चलती भागों को देख सकता हूं।
स्नार्फ

2
मुझे लगता है कि यह उल्लेखनीय है कि यह प्रतिक्रिया पुरानी और पुरानी है, क्योंकि मेरी टिप्पणी की तारीख की आपको कोई आवश्यकता path-to-regexpनहीं है और न ही आप मार्ग पैरामीटर का उपयोग सीधे useविधि के पहले तर्क में कर सकते हैं ।
vdegenne

50

app.use कनेक्ट से "निचले स्तर" की विधि है, जो कि एक्सप्रेसवेयर पर निर्भर करता है।

यहाँ मेरा दिशानिर्देश है:

  • app.getयदि आप एक GET विधि को उजागर करना चाहते हैं तो उपयोग करें ।
  • का प्रयोग करें app.useआप कुछ मिडलवेयर जोड़ना चाहते हैं (एक हैंडलर HTTP अनुरोध के लिए इससे पहले कि यह जिन मार्गों पर एक्सप्रेस में सेट किया हो आता है), या अगर आप अपने मार्गों मॉड्यूलर करना चाहते हैं (उदाहरण के लिए, मार्गों का एक सेट का पर्दाफाश एक npm मॉड्यूल से जो अन्य वेब अनुप्रयोग उपयोग कर सकते हैं)।

लेकिन अगर मुझे विधि की परवाह नहीं है, तो मैं app.useकुछ मार्गों को संभालने के लिए उपयोग कर सकता हूं ? या हमें कभी भी app.useरूटिंग के लिए उपयोग नहीं करना चाहिए ।
तत्वमोचन

आप फ़ाइलों को eq अलग करने के लिए अपने मार्गों को स्थानांतरित करने के लिए app.use का उपयोग कर सकते हैं। users.js, buildings.js
रोब

1
हालाँकि इससे ऊपर का एक उत्तर उत्तर प्रदेश / AGREE में अधिक एकत्र हो गया है, लेकिन आपका उत्तर मिडिलवेयर सहित परिष्कृत चीज़ों को कुछ सरल शब्दों में, कुडू में बदल देता है।
Jeb50

50

बस app.use का अर्थ है "इसे सभी अनुरोधों पर चलाएँ"
app.get का अर्थ है "दिए गए URL के लिए GET अनुरोध पर इसे चलाएँ"


यह इतना आसान नहीं है। अन्य उत्तर पढ़ें
डेविड लोपेज

28

app.getजब HTTP विधि को सेट किया जाता है, तब कहा जाता है GET, जबकि app.useHTTP विधि की परवाह किए बिना कहा जाता है, और इसलिए एक परत को परिभाषित करता है जो अन्य सभी RESTful प्रकारों में सबसे ऊपर है जो एक्सप्रेस पैकेज आपको एक्सेस देता है।


19

app.useऔर app.get: के बीच का अंतर

app.use → यह आम तौर पर आपके आवेदन में बिचौलियों को शुरू करने के लिए उपयोग किया जाता है और सभी प्रकार के HTTP अनुरोधों को संभाल सकता है।

app.get → यह केवल GET HTTP अनुरोधों को संभालने के लिए है।

अब, वहाँ के बीच एक भ्रम की स्थिति है app.useऔर app.all। इसमें कोई शक नहीं, उनमें एक बात कॉमन है, कि दोनों ही हर तरह के HTTP रिक्वेस्ट को हैंडल कर सकते हैं। लेकिन कुछ अंतर हैं जो हमें मध्य संभाल के लिए app.use और मार्ग से निपटने के लिए app.all का उपयोग करने की सलाह देते हैं।

  1. app.use()→ यह केवल एक कॉलबैक लेता है।
    app.all()→ यह कई कॉलबैक ले सकता है।

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

उदाहरण के लिए,

app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject

app.all( "/book" , handler);
// will match /book
// won't match /book/author   
// won't match /book/subject    

app.all( "/book/*" , handler);
// won't match /book        
// will match /book/author
// will match /book/subject
  1. next()कॉल के अंदर app.use()कॉल या तो अगले मिडलवेयर या किसी भी मार्ग के हैंडलर को next()कॉल app.all()करेगा , लेकिन अंदर कॉल केवल अगले रूट हैंडलर ( app.all(), app.get/post/put...आदि) को आमंत्रित करेगा । अगर बाद में कोई मिडलवेयर आता है, तो उसे छोड़ दिया जाएगा। इसलिए, सभी मध्यवारों को हमेशा मार्ग संचालकों के ऊपर रखना उचित है।

1
आपकी बात 3 एक्सप्रेस 4.16 पर लागू नहीं होती है। वसीयत के next()अंदर कॉलिंग app.all('/*', ...)वास्तव app.use('/', ...)में फ़ाइल में बाद में निष्पादित होती है। हो सकता है कि मैंने आपको वहां गलत समझा। बहुत उपयोगी व्याख्या अन्यथा।
बीटलज्यूइस

4.17 में मैंने @BeetleJuice
David Lopez

4

उपरोक्त स्पष्टीकरण के अलावा, मुझे क्या अनुभव है:

app.use('/book', handler);  

URL के रूप में '/ पुस्तक' से शुरू होने वाले सभी अनुरोधों से मेल खाएगा । इसलिए यह '/ book / 1' या '/ book / 2' से भी मेल खाता है

app.get('/book')  

सटीक मिलान के साथ केवल GET अनुरोध का मिलान करता है । यह '/ book / 1' या '/ book / 2' जैसे URL को हैंडल नहीं करेगा

इसलिए, यदि आप एक वैश्विक हैंडलर चाहते हैं जो आपके सभी मार्गों को संभालता है, तो app.use('/')विकल्प है। app.get('/')केवल रूट URL को हैंडल करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.