template pass node jade data app node.js middleware express

pass - Node.js/Express.js-¿Cómo funciona app.router?



next node js (3)

Enrutamiento significa determinar cómo responde una aplicación a una solicitud de cliente a un punto final en particular, que es un URI (o ruta) y un método de solicitud HTTP específico (GET, POST, etc.). Cada ruta puede tener una o más funciones de controlador, que se ejecutan cuando la ruta coincide.

En Express 4.0 Router, tenemos más flexibilidad que nunca para definir nuestras rutas.

Express.Router () se usa varias veces para definir grupos de rutas.

Ruta utilizada como middleware para procesar solicitudes.

ruta utilizada como middleware para validar parámetros usando ".param ()".

app.route () se usa como acceso directo al enrutador para definir múltiples solicitudes en una ruta

cuando usamos app.route (), adjuntamos nuestra aplicación con ese enrutador.

var express = require(''express''); //used as middleware var app = express(); //instance of express. app.use(app.router); app.use(express.static(__dirname + ''/public'')); //All Static like [css,js,images] files are coming from public folder app.set(''views'',__dirname + ''/views''); //To set Views app.set(''view engine'', ''ejs''); //sets View-Engine as ejs app.engine(''html'', require(''ejs'').renderFile); //actually rendering HTML files through EJS. app.get(''/'', function (req, res) { res.render(''index''); }) app.get(''/test'', function (req, res) { res.send(''test'') })

Antes de preguntar por app.router , creo que debería explicar al menos lo que creo que sucede cuando se trabaja con middleware. Para usar middleware, la función a usar es app.use() . Cuando se está ejecutando el middleware, llamará al siguiente middleware utilizando next() o lo hará para que no se llame más al middleware. Eso significa que el orden en el que realizo mis llamadas de middleware es importante, porque algunos middleware dependen de otros middleware, y es posible que algunos middleware cercanos al final ni siquiera se llamen.

Hoy estaba trabajando en mi aplicación y tenía mi servidor funcionando en segundo plano. Quería hacer algunos cambios y actualizar mi página y ver los cambios inmediatamente. Específicamente, estaba haciendo cambios en mi diseño. No pude hacer que funcionara, así que busqué la respuesta en Stack Overflow y encontré esta pregunta . Dice para asegurarse de que express.static() está debajo de require(''stylus'') . Pero cuando miraba el código de ese OP, vi que él tenía su app.router llamada de app.router al final de sus llamadas de middleware, y traté de averiguar por qué era eso.

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 se configuró con mi app.router encima de ambos express.static() y require(''stylus'') llamadas. Así que parece que, si ya viene configurado de esa manera, debería seguir siéndolo.

Después de reorganizar mi código para que pudiera 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 averiguar por qué es importante incluso tener 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 el enrutamiento de mi archivo de rutas (route.index). Así que a continuación navegué a /test y se mostró Test en la pantalla. Jaja, está bien, no tengo idea de lo que hace app.router . Ya sea que esté incluido en mi código o no, mi enrutamiento está bien. Así que definitivamente me falta algo.

Ésta es mi pregunta:

¿Alguien podría explicar qué hace app.router , su importancia y dónde debería 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, revisará el caché para ver si existe.


En Express Version 4 podemos definir rutas fácilmente de la siguiente manera:

server.js:

const express = require(''express''); const app = express(); const route = require(''./route''); app.use(''/route'', route); // here we pass in the imported route object app.listen(3000, () => console.log(''Example app listening on port 3000!''));

route.js:

const express = require(''express''); const router = express.Router(); router.get(''/specialRoute'', function (req, res, next) { // route is now http://localhost:3000/route/specialRoute }); router.get(''/'', function (req, res, next) { // route is now http://localhost:3000/route }); module.exports = router;

En server.js el objeto enrutador del archivo route.js y lo aplicamos de la siguiente manera en server.js :

app.use(''/route'', route);

Ahora todas las rutas en route.js tienen la siguiente URL base:

http://localhost:3000/route

¿Por qué este enfoque:

La principal ventaja de 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 mantener.


Nota: Esto describe cómo funcionó 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 (recursos estáticos ) desde el disco. Le asigna 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. Por lo tanto, una solicitud a su servidor Node para http://server/file.html serviría a /var/www/file.html .

router es el código que ejecuta sus rutas. Cuando haces app.get(''/user'', function(req, res) { ... }); , es el router que realmente invoca la función de devolución de llamada para procesar la solicitud.

El orden en que pasa las cosas a app.use determina el orden en que cada middleware tiene la oportunidad de procesar una solicitud. Por ejemplo, si tiene un archivo llamado test.html en su carpeta estática y una ruta:

app.get(''/test.html'', function(req, res) { res.send(''Hello from route handler''); });

¿Cuál se envía a un cliente que solicita http://server/test.html ? El middleware que se le dé para use primero.

Si haces esto:

app.use(express.static(__dirname + ''/public'')); app.use(app.router);

Luego se sirve el archivo en el disco.

Si lo haces de la otra manera,

app.use(app.router); app.use(express.static(__dirname + ''/public''));

Luego, el controlador de ruta recibe la solicitud y "Hola del controlador de ruta" se envía al navegador.

Por lo general, desea colocar el enrutador por encima del middleware estático para que un archivo con nombre accidental no pueda anular una de sus rutas.

Tenga en cuenta que si no use explícitamente el router , Express lo agrega implícitamente en el punto en que define una ruta (por lo que sus rutas aún funcionaron aunque usted comentó app.use(app.router) ).

Un comentarista ha mencionado otro punto sobre el orden de la static y el router que no había abordado: el impacto en el rendimiento general de su aplicación.

Otra razón para use router encima de la static es optimizar el rendimiento. Si coloca primero la static , entonces golpeará el disco duro en cada solicitud para ver si existe un archivo. En una prueba rápida , descubrí que esta sobrecarga ascendía a ~ 1 ms en un servidor descargado. (Es muy probable que ese número sea mayor bajo carga, donde las solicitudes competirán por el acceso al disco).

Con el router primero, una solicitud que coincida con una ruta nunca tiene que golpear el disco, ahorrando preciosos milisegundos.

Por supuesto, hay formas de mitigar static sobrecarga de la static .

La mejor opción es colocar todos sus recursos estáticos en una carpeta específica. (IE /static ) Luego puedes montar static en esa ruta para que solo se ejecute cuando la ruta comience con /static :

app.use(''/static'', express.static(__dirname + ''/static''));

En esta situación, pondrías esto por encima del router . Esto evita el procesamiento de otro middleware / el enrutador si hay un archivo presente, pero para ser honesto, dudo que gane tanto.

También puede usar staticCache , que almacena en caché los recursos estáticos en la memoria para que no tenga que golpear el disco para los archivos solicitados comúnmente. ( Advertencia: staticCache se eliminará aparentemente en el futuro.)

Sin embargo, no creo que staticCache respuestas negativas (cuando no existe un archivo), por lo que no ayuda si ha colocado staticCache encima del router sin montarlo en una ruta.

Al igual que con todas las preguntas sobre el rendimiento, mida y evalúe su aplicación en el mundo real (bajo carga) para ver dónde están realmente los cuellos de botella.

Expreso 4

Express 4.0 elimina app.router . Todo el middleware ( app.use ) y las rutas ( app.get et al) ahora se procesan exactamente en el orden en que se agregaron.

En otras palabras:

Todos los métodos de enrutamiento se agregarán en el orden en que aparecen. No debes hacer app.use(app.router) . Esto elimina el problema más común con Express.

En otras palabras, mezclar app.use() y app[VERB]() funcionará exactamente en el orden en que se llaman.

app.get(''/'', home); app.use(''/public'', require(''st'')(process.cwd())); app.get(''/users'', users.list); app.post(''/users'', users.create);

Lea más sobre los cambios en Express 4.