¿Existe una diferencia útil entre app.all('*', ... )
y app.use('/', ...)
en Node.JS Express?
¿Existe una diferencia útil entre app.all('*', ... )
y app.use('/', ...)
en Node.JS Express?
Respuestas:
En la mayoría de los casos, funcionarían de manera equivalente. La mayor diferencia es el orden en el que se aplicaría el middleware:
app.all()
se conecta al enrutador de la aplicación, por lo que se usa siempre que se alcanza el middleware app.router (que maneja todas las rutas del método ... GET, POST, etc.).AVISO: app.router ha quedado obsoleto en Express 4.x
app.use()
se adjunta a la pila principal de middleware de la aplicación, por lo que se usa en el orden especificado por el middleware. por ejemplo, si lo pone primero, será lo primero que se ejecute. Si lo coloca en último lugar (después del enrutador), generalmente no se ejecutará en absoluto.Por lo general, si desea hacer algo globalmente en todas las rutas, app.use () es la mejor opción. Además, tiene menos posibilidades de errores en el futuro, ya que express 0.4 probablemente eliminará el enrutador implícito (lo que significa que la posición del enrutador en el middleware será más importante de lo que es ahora, ya que técnicamente ni siquiera tiene que usarlo ahora mismo).
next("route")
con app.all
, pero no con app.use
.
app.use solo acepta una función de devolución de llamada y está destinada a Middleware. El middleware generalmente no maneja solicitudes y respuestas (técnicamente pueden), solo procesan los datos de entrada y los entregan al siguiente controlador en la cola.
app.use([path], function)
app.all acepta múltiples devoluciones de llamada y está diseñado para enrutamiento. con múltiples devoluciones de llamada, puede filtrar solicitudes y enviar respuestas. Se explica en Filtros en express.js
app.all(path, [callback...], callback)
app.use solo ve si la URL comienza con la ruta especificada
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.all coincidirá con la ruta completa
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
uso de la aplicación:
espantar:
Mira este ejemplo de código de 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);
Aquí está el registro al acceder a la ruta '/ hola':
(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
Con app.use()
, la ruta de "montaje" se elimina y no es visible para la función de middleware:
app.use('/static', express.static(__dirname + '/public'));
Las funciones de middleware montadas ( express.static
) no se invocan a menos que req.url
contenga este prefijo ( /static
), en cuyo momento se elimina cuando se invoca la función.
Con app.all()
, no hay ese comportamiento.
Sí, app.all()
se llama cuando se solicita un URI en particular con cualquier tipo de método de solicitud (POST, GET, PUT o DELETE)
Por otro lado, app.use()
se usa para cualquier middleware que pueda tener y se monta en un prefijo de ruta, y se llamará cada vez que se solicite un URI en esa ruta.
Dos diferencias todas las respuestas anteriores no mencionan.
El primero: app.all
acepta una expresión regular como parámetro de ruta. app.use
NO acepta expresiones regulares.
El segundo:
app.all(path,handler)
o app[method](path,handler)
, el controlador path
debe ser el mismo para todos path
. Es decir, la ruta de la aplicación [método] está completa.
app.use(path,hanlder)
, si la ruta del uso está completa, la ruta del manejador debe ser '/'. Si la ruta del uso es el comienzo de la ruta completa, la ruta del manejador debe ser el resto de la ruta completa.
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');
});
Hay dos diferencias principales:
1. coincidencia de patrones (respuesta dada por Palani)
2. next(route)
no funcionará dentro del cuerpo de la función del middleware cargado con app.use
. Esto se indica en el enlace de los documentos:
NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.
Enlace: http://expressjs.com/en/guide/using-middleware.html
El efecto de trabajo de next('route')
se puede ver en el siguiente ejemplo:
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();});