Node.JS Express arasında app.all('*', ... )ve app.use('/', ...)içinde yararlı bir fark var mı ?
Node.JS Express arasında app.all('*', ... )ve app.use('/', ...)içinde yararlı bir fark var mı ?
Yanıtlar:
Ç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).
next("route")birlikte kullanamazsınız . app.allapp.use
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
app.use:
app.all:
Ş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
İ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.
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.
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');
});
İ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();});