Antes de preguntar app.router
, creo que debería explicar al menos lo que creo que sucede cuando trabajo con middleware. Para usar middleware, la función a usar es app.use()
. Cuando se ejecuta el middleware, llamará al siguiente middleware mediante el uso next()
o lo hará para que no se llame más middleware. Eso significa que el orden en el que coloco mis llamadas de middleware es importante, porque algunos middleware dependen de otro middleware, y algunos middleware cerca del final podrían ni siquiera ser llamados.
Hoy estaba trabajando en mi aplicación y tenía mi servidor ejecutándose en segundo plano. Quería hacer algunos cambios, actualizar mi página y ver los cambios de inmediato. Específicamente, estaba haciendo cambios en mi diseño. No pude hacerlo funcionar, así que busqué la respuesta de Stack Overflow para encontrar esta pregunta . Dice asegurarse de que express.static()
esté debajo require('stylus')
. Pero cuando estaba mirando el código de ese OP, vi que tenía su app.router
llamada al final de sus llamadas de middleware, y traté de entender por qué.
Cuando hice mi aplicación Express.js (versión 3.0.0rc4), usé el comando express app --sessions --css stylus
y en mi archivo app.js el código vino configurado con mi app.router
anterior express.static()
y las require('stylus')
llamadas. Entonces parece que, si ya viene configurado de esa manera, entonces debería permanecer así.
Después de reorganizar mi código para poder ver los cambios de mi Stylus, se ve así:
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
Así que decidí que el primer paso sería descubrir por qué es importante incluso tenerlo app.router
en mi código. Así que lo comenté, comencé mi aplicación y navegué a /
. Se muestra mi página de índice muy bien. Hmm, tal vez funcionó porque estaba exportando la ruta desde mi archivo de rutas (routes.index). Entonces, a continuación, navegué /test
y se mostró Prueba en la pantalla. Jaja, está bien, no tengo idea de lo que app.router
hace. Ya sea que esté incluido en mi código o no, mi enrutamiento está bien. Así que definitivamente me estoy perdiendo algo.
Ésta es mi pregunta:
¿Podría alguien explicarme qué app.router
hace, la importancia de esto y dónde debo colocarlo en mis llamadas de middleware? También sería bueno si recibiera una breve explicación sobre express.static()
. Por lo que puedo decir, express.static()
es un caché de mi información, y si la aplicación no puede encontrar la página solicitada, verificará el caché para ver si existe.
fuente
Respuestas:
Nota: Esto describe cómo funciona Express en las versiones 2 y 3. Consulte el final de esta publicación para obtener información sobre Express 4.
static
simplemente sirve archivos ( estático recursos ) del disco. Le das una ruta (a veces llamada el punto de montaje), y sirve los archivos en esa carpeta.Por ejemplo,
express.static('/var/www')
serviría los archivos en esa carpeta. Así que una petición al servidor de nodo parahttp://server/file.html
serviría/var/www/file.html
.router
es un código que ejecuta tus rutas. Cuando lo haceapp.get('/user', function(req, res) { ... });
, es lorouter
que realmente invoca la función de devolución de llamada para procesar la solicitud.El orden al que pasa las cosas
app.use
determina el orden en que cada middleware tiene la oportunidad de procesar una solicitud. Por ejemplo, si tiene un archivo llamadotest.html
en su carpeta estática y una ruta:¿Cuál se envía a un cliente que lo solicita
http://server/test.html
? Cualquier middleware que se le déuse
primero.Si haces esto:
Luego se sirve el archivo en el disco.
Si lo haces al revés,
Luego, el controlador de ruta recibe la solicitud y se envía al navegador "Hola desde el controlador de ruta".
Por lo general, desea colocar el enrutador arriba el middleware estático para que un archivo nombrado accidentalmente no pueda anular una de sus rutas.
Tenga en cuenta que si no lo hace de forma explícita
use
elrouter
, se añade implícitamente por expreso en el punto que define una ruta (por eso sus rutas aún funcionaban a pesar de que en comentarioapp.use(app.router)
).Un comentarista ha planteado otro punto sobre el orden
static
yrouter
que no había abordado: el impacto en el rendimiento general de su aplicación.Otra razón para lo
use
router
anteriorstatic
es optimizar el rendimiento. Si lo colocastatic
primero, accederá al disco duro en cada solicitud para ver si existe o no un archivo. En una prueba rápida , descubrí que esta sobrecarga ascendía a ~ 1 ms en un servidor descargado. (Es probable que ese número sea mayor bajo carga, donde las solicitudes competirán por el acceso al disco).Con
router
la primera, una solicitud que coincide con una ruta nunca tiene que golpear el disco, ahorrando milisegundos preciosos.Por supuesto, hay formas de mitigar
static
los gastos generales.La mejor opción es colocar todos sus recursos estáticos en una carpeta específica. (IE
/static
) Luego puede montarstatic
en esa ruta para que solo se ejecute cuando la ruta comienza con/static
:En esta situación, pondrías esto arriba
router
. Esto evita el procesamiento de otro middleware / enrutador si hay un archivo presente, pero para ser honesto, dudo que ganes tanto.También puede usar
staticCache
, que almacena en caché los recursos estáticos en la memoria para que no tenga que presionar el disco para los archivos solicitados comúnmente. ( Advertencia:staticCache
aparentemente se eliminará en el futuro).Sin embargo, no creo que
staticCache
guarde en caché las respuestas negativas (cuando no existe un archivo), por lo que no ayuda si lo ha puestostaticCache
arribarouter
sin montarlo en una ruta.Al igual que con todas las preguntas sobre el rendimiento, mida y compare su aplicación del mundo real (bajo carga) para ver dónde están realmente los cuellos de botella.
Expreso 4
Express 4.0 elimina
app.router
. Todos los middleware (app.use
) y rutas (app.get
et al) ahora se procesan exactamente en el orden en que se agregan.En otras palabras:
Lea más sobre los cambios en Express 4.
fuente
router
va en un solo lugar. Si, la primera vez que se llamaapp.get
(opost
, u otros), aún no se hause
dapp.router
, agrega expreso por usted.static
afterrouter
, la pregunta sobre el otro middleware se vuelve irrelevante ya que debe estar por encima del enrutador.app.router
se elimina en la rama maestra actual, que será express-4.0 . Cada ruta se convierte en un middleware separado.fuente
En la versión express 4 podemos definir fácilmente rutas de la siguiente manera:
server.js:
route.js:
En
server.js
importamos el objeto enrutador delroute.js
archivo y lo aplicamos de la siguiente manera enserver.js
:Ahora todas las rutas en el
route.js
tienen la siguiente URL base:http: // localhost: 3000 / route
Por qué este enfoque:
La principal ventaja de adoptar este enfoque es que ahora nuestra aplicación es más modular . Todos los controladores de ruta para una ruta determinada ahora se pueden colocar en diferentes archivos, lo que hace que todo sea más fácil de mantener y encontrar.
fuente