¿Existe una diferencia útil entre app.all('*', ... )
y app.use('/', ...)
en Node.JS Express?
121
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")
conapp.all
, pero no conapp.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.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.use solo ve si la URL comienza con la ruta especificada
app.all coincidirá con la ruta completa
fuente
uso de la aplicación:
espantar:
Mira este ejemplo de código de expressJs:
Aquí está el registro al acceder a la ruta '/ hola':
fuente
Con
app.use()
, la ruta de "montaje" se elimina y no es visible para la función de middleware:Las funciones de middleware montadas (
express.static
) no se invocan a menos quereq.url
contenga este prefijo (/static
), en cuyo momento se elimina cuando se invoca la función.Con
app.all()
, no hay ese comportamiento.fuente
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.Aquí está la documentación para app.all y app.use .
fuente
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)
oapp[method](path,handler)
, el controladorpath
debe ser el mismo para todospath
. 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.fuente
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 conapp.use
. Esto se indica en el enlace de los documentos:Enlace: http://expressjs.com/en/guide/using-middleware.html
El efecto de trabajo de
next('route')
se puede ver en el siguiente ejemplo:fuente