Есть ли полезное различие между app.all('*', ... )
и app.use('/', ...)
в Node.JS Express?
Разница между app.all('*') и app.use('/')
Ответ 1
В большинстве случаев они будут работать одинаково. Самым большим отличием является порядок применения промежуточного программного обеспечения:
-
app.all()
подключается к маршрутизатору приложения, поэтому он используется всякий раз, когда достигается промежуточное программное обеспечение app.router (которое обрабатывает все маршруты метода... GET, POST и т.д.).
ВНИМАНИЕ: app.router устарел в Express 4.x
-
app.use()
присоединяется к основному стеку промежуточного программного обеспечения приложения, поэтому оно используется в порядке, указанном промежуточным программным обеспечением. Например, если вы поставите его первым, он запустится первым. Если поставить его последним (после маршрутизатора), он обычно вообще не запускается.
Обычно, если вы хотите сделать что-то глобально для всех маршрутов, лучше использовать app.use(). Кроме того, у него меньше шансов на будущие ошибки, поскольку Express 0.4, вероятно, отбросит неявный маршрутизатор (это означает, что положение маршрутизатора в промежуточном программном обеспечении будет более важным, чем сейчас, поскольку технически вам даже не нужно его использовать). прямо сейчас).
Ответ 2
app.use принимает только одну функцию обратного вызова и предназначена для Middleware. Промежуточное ПО обычно не обрабатывает запросы и ответы (технически они могут), они просто обрабатывают входные данные и передают их следующему обработчику в очереди.
app.use([path], function)
app.all принимает несколько обратных вызовов и предназначен для маршрутизации. с несколькими обратными вызовами вы можете фильтровать запросы и отправлять ответы. Это объясняется в фильтрах на express.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
Ответ 3
-
app.use:
- введите middlware на ваш контроллер, например: заголовок, файлы cookie, сеансы и т.д.
- должен быть написан до приложения [http_method], иначе он не будет выполнен.
- несколько вызовов обрабатываются в порядке написания
-
app.all:
- (например, приложение [http_method]) используется для настройки контроллеров маршрутов.
- "all" означает, что он применяется ко всем методам http.
- несколько вызовов обрабатываются в порядке написания
Посмотрите на этот пример кода expressJs:
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);
Вот журнал при доступе к маршруту '/hello':
(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
Ответ 4
С app.use()
путь "монтирования" разделяется и не отображается в функции промежуточного программного обеспечения:
app.use('/static', express.static(__dirname + '/public'));
Установленные функции промежуточного программного обеспечения (express.static
) не вызывается, если только req.url
не содержит этот префикс (/static
), , в этот момент он отключается при вызове функции.
С app.all()
этого поведения нет.
Ответ 5
Да, app.all()
вызывается, когда запрашивается конкретный URI с любым типом метода запроса (POST, GET, PUT или DELETE)
С другой стороны, app.use()
используется для любого промежуточного программного обеспечения, которое у вас может быть, и оно монтируется на префикс пути и будет вызываться в любое время, когда запрашивается URI по этому маршруту.
Ответ 6
Два отличия во всех приведенных выше ответах не имеют значения.
Первый: app.all
принимает регулярное выражение в качестве параметра пути. app.use
НЕ принимает регулярное выражение.
Второй: app.all(path,handler)
или app[method](path,handler)
, path
обработчику должен быть одинаковым со всем path
. Это путь app [method] 'завершен.
app.use(path,hanlder)
, если путь использования завершен, путь 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');
});