Разница между app.all('*') и app.use('/')

Есть ли полезное различие между app.all('*', ... ) и app.use('/', ...) в Node.JS Express?

Ответ 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 по этому маршруту.

Вот документация для app.all и app.use.

Ответ 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');
 });