App.all ('*') ve app.use ('/') arasındaki fark


121

Node.JS Express arasında app.all('*', ... )ve app.use('/', ...)içinde yararlı bir fark var mı ?

Yanıtlar:


119

Çoğu durumda eşit olarak çalışırlar. En büyük fark, ara yazılımın uygulanacağı sıradır:

  • app.all() uygulamanın yönlendiricisine eklenir, böylece app.router ara yazılımına her erişildiğinde kullanılır (tüm yöntem yollarını işler ... GET, POST, vb.).

DİKKAT: app.router, ekspres 4.x sürümünde kullanımdan kaldırıldı

  • app.use()uygulamanın ana ara yazılım yığınına eklenir, bu nedenle ara yazılım tarafından belirtilen sırada kullanılır. örneğin, ilk koyarsanız, çalıştırılacak ilk şey olacaktır. Son olarak koyarsanız (yönlendiriciden sonra), genellikle hiç çalışmaz.

Genellikle, tüm rotalarda global olarak bir şeyler yapmak istiyorsanız, app.use () daha iyi bir seçenektir. Ayrıca, gelecekteki hata şansı daha azdır, çünkü express 0.4 muhtemelen örtük yönlendiriciyi bırakacaktır (yani, ara yazılımdaki yönlendiricinin konumu şu anda olduğundan daha önemli olacaktır, çünkü teknik olarak onu kullanmak zorunda bile değilsiniz. şimdi).


15
Bu, Express 4.x'ten sonra hala geçerli mi? app.router kaldırıldı.
ruffrey

1
İle kullanabilirsiniz , ancak next("route")birlikte kullanamazsınız . app.allapp.use
Jozef Mikušinec

@JozefMikusinec Belgeleri aksini öneriyor gibi görünüyor ... expressjs.com/en/guide/writing-middleware.html
musicin3d

Bağlantınız bir sonraki ('rotadan') bahsetmiyor, ancak API'ye baktım, haklısınız.
Jozef Mikušinec

2
@ musicin3d Daha fazla araştırma yaptım ve bu GitHub sorununu buldum , bu "sonraki () ve sonraki ('rota') ile app.use" (alıntı) arasında bir fark olmadığını doğruluyor. Belgeleri değiştirmeleri gerekir.
Jozef Mikušinec

87

app.use yalnızca bir geri arama işlevi alır ve bu, Middleware içindir. Ara yazılım genellikle istek ve yanıtı işlemez (teknik olarak yapabilir) sadece giriş verilerini işler ve sıradaki bir sonraki işleyiciye verir.

app.use([path], function)

app.all , birden çok geri aramayı alır ve yönlendirme içindir. çoklu geri aramalarla istekleri filtreleyebilir ve yanıt gönderebilirsiniz. Express.js'deki Filtrelerde açıklanmıştır

app.all(path, [callback...], callback)

app.use yalnızca url'nin belirtilen yolla başlayıp başlamadığını görür

app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo

app.all tam yolla eşleşecek

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
En azından v4'te, app.use "yalnızca bir tane" değil, bir veya daha fazla ara yazılım işlevi alır .
Jess Austin

2
app.use yalnızca url'nin belirtilen yolla başlayıp başlamadığını görür; app.all tam yolla eşleşir. bu temel farktır.
meizilp

@frogcjn hayır, sorumdaki * ve / işaretlerini görmezden gelmemeli.
ostergaard

15
  • app.use:

    1. Örneğin; başlık, çerezler, oturumlar vb. yapılandırarak ön denetleyicinize orta düzey yazılım enjekte edin.
    2. uygulamadan [http_method] önce yazılmalıdır, aksi takdirde çalıştırılmaz.
    3. birkaç çağrı yazma sırasına göre işlenir
  • app.all:

    1. ([http_method] uygulaması gibi) rotaların denetleyicilerini yapılandırmak için kullanılır
    2. "tümü", tüm http yöntemlerinde geçerli olduğu anlamına gelir.
    3. birkaç çağrı yazma sırasına göre işlenir

Şu expressJs kod örneğine bakın:

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

İşte '/ merhaba' rotasına erişirken günlük:

(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
Bu örneği birebir ifade 4.x üzerinde çalıştırdıktan sonra, aslında 5'in hepsini de sırayla çalıştırır. Bu, muhtemelen yazıldıktan sonraki 3 yıl içinde ifade edilen değişikliklerden kaynaklanıyor, ancak bunu netlik için ekleyeceğimi düşündüm.
Nathan Wiebe

11

İle app.use(), "bağlama" yolu çıkarılır ve ara yazılım işlevi tarafından görülmez:

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

Bağlı ara yazılım işlevleri ( express.static) req.url, bu öneki ( /static) içermediği sürece çağrılmaz , bu noktada işlev çağrıldığında çıkarılır .

İle app.all(), böyle bir davranış yok.


Soru, yalnızca app.use ('/', ...) hakkında açıkça soruyor.
ostergaard

Bu, 2018'de hala geçerli olan sorunun doğru cevabı! Bir ara yazılım all () ile de monte edilebilir ... tek fark, ara yazılım yürütülürken bağlama yolunun soyulmasıdır.
Xatian

4

Evet, app.all()herhangi bir istek yöntemiyle (POST, GET, PUT veya DELETE) belirli bir URI istendiğinde çağrılır

Diğer yandan app.use(), sahip olabileceğiniz herhangi bir ara yazılım için kullanılır ve bir yol önekine bağlanır ve bu yol altında bir URI istendiğinde çağrılır.

İşte app.all & app.use ile ilgili belgeler .


teşekkürler ama sanırım app.all joker karakterini ve app.use root yolunu kaçırdınız, bu da onları hemen hemen aynı şey yapıyor, değil mi? Bunun dışında app.all bir dizi geri aramayı alabilir ve app.use yalnızca birini alabilir - değil mi?
ostergaard

1

Yukarıdaki tüm cevapların iki farkı karşılanmaz.

İlki: app.allbir normal ifadeyi yol parametresi olarak kabul eder. app.usenormal ifadeyi KABUL ETMEZ.

İkincisi: app.all(path,handler)ya app[method](path,handler), işleyici en pathaynı olmalıdır tüm yılların path . Bu, uygulama [yöntem] 'yolu tamamlandı.

app.use(path,hanlder), eğer kullanım yolu tamamlanmışsa, tutucunun yolu "/" olmalıdır. kullanım yolu tam yolun başlangıcıysa, işleyici yolu tam yolun geri kalanı olmalıdır.

 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

İki ana fark vardır:

1. desen eşleme (yanıt Palani tarafından verilir)
2. next(route)kullanılarak yüklenen ara katman yazılımının işlev gövdesi içinde çalışmaz app.use. Bu, dokümanlardaki bağlantıda belirtilmiştir:

NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.

Bağlantı: http://expressjs.com/en/guide/using-middleware.html

Çalışma etkisi next('route')aşağıdaki örnekten görülebilir:

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