Express.js'de app.use ve app.get arasındaki fark


220

Express ve node.js'yi biraz yeniyim ve app.use ve app.get arasındaki farkı anlayamıyorum. Her ikisini de bilgi göndermek için kullanabileceğiniz anlaşılıyor. Örneğin:

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

şu şekilde aynı görünüyor:

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

1
Görünüşe göre hepsi konuya katkıda bulunan üç farklı cevabınız var :) İşte ilgili bir soru stackoverflow.com/questions/11321635/…
Benjamin Gruenbaum

evet, tüm iyi cevaplar. Teşekkürler, buna bir göz atacağım.
Andre Vorobyov

Yanıtlar:


219

app.use()ara katmanı uygulamanıza bağlamak için tasarlanmıştır . pathBir "dir monte " ya da " öneki " yolu ve talep sadece herhangi yollara başvurma ara katman sınırlar başlar onunla. Başka bir uygulamayı gömmek için bile kullanılabilir:

// 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'));

// ...

Belirterek /bir "olarak monte " yolu, app.use()herhangi bir yol yanıt verecektir bununla başlar /kullanılan fiil hepsi ve ne olursa olsun, HTTP vardır:

  • GET /
  • PUT /foo
  • POST /foo/bar
  • vb.

app.get()Öte yandan, Express'in uygulama yönlendirmesinin bir parçasıdır ve GETHTTP fiiliyle istendiğinde belirli bir rotayı eşleştirmek ve işlemek için tasarlanmıştır :

  • GET /

Ve örneğiniz için eşdeğer yönlendirme app.use()aslında:

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

( Güncelleme: Farklılıkları daha iyi göstermeye çalışıyor. )

Yönlendirme yöntemleri, app.get()yanıtları isteklere daha hassas bir şekilde hizalamanıza yardımcı olan kolaylık yöntemleridir. Ayrıca parametreler ve gibi özellikler için destek ekler next('route').

Her birinin app.get()içinde bir çağrı var app.use(), bu yüzden tüm bunları kesinlikle app.use()doğrudan yapabilirsiniz. Ancak, bunu yapmak genellikle çeşitli miktarlarda kazan plakasının yeniden uygulanmasını (muhtemelen gereksiz yere) gerektirir.

Örnekler:

  • Basit, statik yollar için:

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

    vs.

    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      // ...
    });
  • Aynı rota için birden fazla işleyici ile:

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

    vs.

    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);
    
        // ...
      });
    });
  • Parametrelerle:

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

    vs.

    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;
      // ...
    });

Not: Bu özelliklerin Express' uygulaması onun içinde bulunur Router, LayerveRoute .


3
Gömülü uygulamalardan bahsettiğiniz için şeref. Hızlı ara katman yazılımı düzenlemenin çok kullanışlı bir yoludur.
wprl

4
App.use uygulamasının, app.get, app.post, app.put öğelerinin her birini yapabileceğini, ancak bunun tersini yapamayacağını söylemek doğru olur mu?
ngungo

6
hala anlaşılması zor.
Jeb50

1
It en iyi nedir kullanımını bilmek ve almak için , ama kimse onlar farklı işlev açıklayan bir iş çıkarıyor. Toplayabildiğim kadarıyla, tüm .use işleyicileri önce çalışır ve .use belirtilen yolla başlayan herhangi bir yolla eşleşir (yani .use ('/', ...) ve .get ('/ *', ... ) aynı yollarla eşleşir). Benim için hareketli parçaları görebildiğimde genel kavramları anlamak daha kolay.
snarf

2
Sanırım bu cevabın eski ve eski olduğuna dikkat çekiyorum, yorumumun tarihi itibariyle ihtiyacınız olmayan path-to-regexpveya artık bir şey yok ve rota parametrelerini doğrudan useyöntemin ilk argümanında kullanabilirsiniz .
vdegenne

50

app.use Express'in bağlı olduğu orta katman çerçevesi olan Connect'ten "düşük düzey" yöntemidir.

İşte benim kılavuz:

  • app.getBir GET yöntemini göstermek istiyorsanız kullanın .
  • Kullanın app.useEğer modüler rotalarınızı yapmak istiyorsanız (Eğer Express'te kurduğunuz yolları gelmeden önce HTTP isteğinin için bir işleyici) bazı ara katman eklemek istiyorsanız, ya da (örneğin, yolların bir dizi açığa diğer web uygulamalarının kullanabileceği bir npm modülünden).

Ama yöntemi umursamıyorum, app.usebazı yolları işlemek için kullanabilir miyim? Veya app.useyönlendirme için asla kullanmamalıyız .
Elemento0

Rotalarınızı ayrı dosyalara taşımak için app.use kullanabilirsiniz. users.js, buildings.js
Rob Angelier,

1
Her ne kadar bu sorunun cevabı çok daha YUKARI / KABUL ETMİŞ olsa da, cevabınız Middleware dahil karmaşık şeyleri birkaç basit kelimeye çevirir, kudo.
Jeb50

50

Basitçe app.use “Bunu TÜM isteklerde çalıştır”
anlamına gelir. App.get “verilen URL için bunu bir GET isteğinde çalıştır ” anlamına gelir


O kadar basit değil. Diğer cevapları okuyun.
David Lopez

28

app.getçağrılan HTTP yöntemi olarak ayarlandığında GETise, app.usene olursa olsun HTTP yöntemi denir ve bu nedenle ekspres paketleri erişim sağlar, diğer tüm RESTful türleri üstünde olan bir katman tanımlar.


19

app.use& Arasındaki fark app.get:

app.use → Genellikle uygulamanızda ara yazılımları tanıtmak için kullanılır ve her türlü HTTP isteğini işleyebilir.

app.get → Yalnızca GET HTTP isteklerini işlemek içindir.

Şimdi, app.use& arasında bir karışıklık var app.all. Kuşkusuz, her ikisinde de her türlü HTTP isteğini işleyebilecek ortak bir şey vardır. Ancak, midwares için app.use ve rota kullanımı için app.all kullanmanızı tavsiye eden bazı farklılıklar vardır.

  1. app.use()→ Yalnızca bir geri arama gerekir.
    app.all()→ Birden fazla geri arama alabilir.

  2. app.use()yalnızca url'nin belirtilen yolla başlayıp başlamadığını görür.
    Ancak, app.all()tam yolla eşleşecektir.

Örneğin,

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()içeride çağrı app.use()sonraki ara katman veya herhangi rota işleyicisi ya arayacak ama next()çağrı içi app.all()(sonraki rota işleyicisi çağıracağı app.all(), app.get/post/put...sadece vs.). Sonra herhangi bir ara yazılım varsa, atlanacaktır. Bu nedenle, tüm orta yolların her zaman rota işleyicilerinin üzerine yerleştirilmesi önerilir.

1
3. noktanız Express 4.16'da geçerli görünmüyor. next()içinde çağırma app.all('/*', ...)aslında app.use('/', ...)dosyada bir sonraki yürütür . Belki seni orada yanlış anladım. Aksi takdirde çok yararlı bir açıklama.
BeetleJuice

4.17'de @BeetleJuice ile aynı şeyi gözlemledim
David Lopez

4

Yukarıdaki açıklamalara ek olarak, yaşadıklarım:

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

'/ book' ile başlayan tüm istekleri URL olarak eşleştirecek . bu yüzden '/ book / 1' veya '/ book / 2' ile de eşleşir

app.get('/book')  

yalnızca tam eşleşmeyle GET isteğini eşleştirir . '/ Book / 1' veya '/ book / 2' gibi URL'leri işlemez

Yani, tüm rotalarınızı işleyen küresel bir işleyici istiyorsanız app.use('/'), seçenek. app.get('/')yalnızca kök URL'yi işler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.