Soy un poco nuevo en express y node.js, y no puedo entender la diferencia entre app.use y app.get. Parece que puede usar ambos para enviar información. Por ejemplo:
app.use('/',function(req, res,next) {
res.send('Hello');
next();
});
parece ser lo mismo que esto:
app.get('/', function (req,res) {
res.send('Hello');
});
Respuestas:
app.use()
está destinado a vincular middleware a su aplicación. Elpath
es una ruta de " montaje " o " prefijo " y limita el middleware para que solo se aplique a las rutas solicitadas que comienzan con él. Incluso se puede usar para incrustar otra aplicación:Al especificar
/
como una ruta de " montaje ",app.use()
responderá a cualquier ruta que comience/
, que son todas e independientemente del verbo HTTP utilizado:GET /
PUT /foo
POST /foo/bar
app.get()
, por otro lado, es parte del enrutamiento de la aplicación Express y está destinado a hacer coincidir y manejar una ruta específica cuando se solicita con elGET
verbo HTTP:GET /
Y, el enrutamiento equivalente para su ejemplo de
app.use()
realidad sería:( Actualización: Intentando demostrar mejor las diferencias ) .
Los métodos de enrutamiento, incluidos
app.get()
, son métodos convenientes que lo ayudan a alinear las respuestas a las solicitudes con mayor precisión. También agregan soporte para características como parámetros ynext('route')
.Dentro de cada uno
app.get()
hay una llamada aapp.use()
, por lo que ciertamente puede hacer todo estoapp.use()
directamente. Pero hacerlo requerirá a menudo (probablemente innecesariamente) reimplementar varias cantidades de código repetitivo.Ejemplos:
Para rutas simples y estáticas:
vs.
Con múltiples controladores para la misma ruta:
vs.
Con parámetros:
vs.
fuente
path-to-regexp
ni nada, y puede usar parámetros de ruta directamente en el primer argumento deluse
método.app.use
es el método de "nivel inferior" de Connect, el marco de middleware del que Express depende.Aquí está mi guía:
app.get
si desea exponer un método GET.app.use
si desea agregar algún middleware (un controlador para la solicitud HTTP antes de que llegue a las rutas que ha configurado en Express), o si desea que sus rutas sean modulares (por ejemplo, exponga un conjunto de rutas desde un módulo npm que otras aplicaciones web podrían usar).fuente
app.use
para manejar algunas rutas? O nunca deberíamos usarapp.use
para el enrutamiento.Simplemente app.use significa "Ejecutar esto en TODAS las solicitudes"
app.get significa "Ejecutar esto en una solicitud GET, para la URL dada"
fuente
app.get
se llama cuando el método HTTP se establece enGET
, mientras queapp.use
se llama independientemente del método HTTP y, por lo tanto, define una capa que está por encima de todos los otros tipos RESTful a los que los paquetes express le dan acceso.fuente
Diferencia entre
app.use
&app.get
:app.use
→ Generalmente se usa para introducir middlewares en su aplicación y puede manejar todo tipo de solicitudes HTTP.app.get
→ Es solo para manejar solicitudes GET HTTP.Ahora, hay una confusión entre
app.use
&app.all
. Sin duda, hay una cosa común en ellos, que ambos pueden manejar todo tipo de solicitudes HTTP. Pero hay algunas diferencias que nos recomiendan usar app.use para middlewares y app.all para el manejo de rutas.app.use()
→ Solo se necesita una devolución de llamada.app.all()
→ Puede tomar múltiples devoluciones de llamada.app.use()
solo verá si la url comienza con la ruta especificada.Pero,
app.all()
coincidirá con la ruta completa.Por ejemplo,
next()
llamar al interiorapp.use()
llamará al siguiente middleware o a cualquier controlador de ruta, peronext()
llamar al interiorapp.all()
invocará únicamente al siguiente controlador de ruta (app.all()
,app.get/post/put...
etc.). Si hay algún middleware después, se omitirá. Por lo tanto, es recomendable colocar todos los middlewares siempre por encima de los controladores de ruta.fuente
next()
dentro deapp.all('/*', ...)
will de hecho ejecutará unaapp.use('/', ...)
posterior en el archivo. Tal vez te entendí mal allí. Muy útil explicación de lo contrario.Además de las explicaciones anteriores, lo que experimento:
coincidirá con todas las solicitudes que comiencen con '/ book' como URL. entonces también coincide con '/ book / 1' o '/ book / 2'
solo coincide con la solicitud GET con la coincidencia exacta . No manejará URL como '/ book / 1' o '/ book / 2'
Entonces, si desea un controlador global que maneje todas sus rutas, entonces esa
app.use('/')
es la opción.app.get('/')
manejará solo la URL raíz.fuente