2012-05-20 47 views
7

Todavía estoy envolviendo mi cabeza alrededor del nodo, pero tengo una pregunta muy simple. Veo muchos ejemplos de nodos donde las personas declaran sus rutas y toda su lógica en un único archivo app.js (o, a veces, dividiéndolos en subarchivos).Node.js, restify y enrutamiento adecuado

Mi pregunta es básicamente: ¿es mejor mantener todas las declaraciones de ruta en la aplicación o arrancar una ruta genérica que se corresponda con la estructura de su archivo? Esto puede parecer una pregunta primitiva, pero mi objetivo es captar lo que es más eficiente dentro del nodo.

Actualmente estoy compilando un controlador API con Restify, pero tengo otra aplicación que usa Express (por lo que esta pregunta probablemente responderá ambas preguntas).

En mi ruta que puede o bien declarar una sola ruta de arranque de este modo:

app.all('/api/:package/:controller', function(request, response) { 
    var controller = require(
     '../' + request.params.package + '/api/' + request.params.controller 
    ); 
    controller.index(request, response); 
    response.end(); 
}); 

Básicamente, esto significa que acepta todas las llamadas de la API y las metas del controlador API adecuada. Alternativamente, puedo declarar cada ruta individualmente o incluso escribir un bucle que pasa por cada uno de mis controladores y declararlos en init. Entonces:

for (var i in packages.controllers) { 
    app.all('api/' + package + '/' + controllers[i].name, function(request, response) { 
     var controller = require(
      '../' + request.params.package + '/api/' + request.params.controller 
     ); 
     controller.index(request, response); 
    } 
} 

packages.controllers que son una matriz de todos los controladores posibles. Tenga en cuenta que el código anterior no es preciso, tengo una estructura de carpetas HMVC, por lo que el código es un poco más complicado que el anterior. Pero usted consigue el punto.

Me pregunto cuáles son las consecuencias de cualquiera y si realmente importa en absoluto?

Gracias!

Respuesta

3

El archivo app.js en explosión nos llevó a algunos de nosotros a crear una pequeña aplicación de referencia para codificar una estructura de aplicación Express estándar. No es ciencia espacial, sino más bien un conjunto de convenciones que hace las cosas más organizadas.

Se puede encontrar aquí: https://github.com/EAAppFoundry/tableau

Habíamos sugerencias amor/pull solicitudes si hay algo que tenemos mal o no se encuentra.

+0

Gracias Don, esa es una repetición muy interesante que ustedes tienen allí. Sin embargo, creo que mi pregunta principal aún no está resuelta. En tu aplicación estás definiendo cada una de las rutas explícitamente en routes.js. Quiero generar esto automágicamente así que no tengo que definir manualmente las rutas. – pilotguy

+1

cosas mágicas tienden a asustarme ... :) Fuimos con el archivo routes.js b/c explícito. hace que sea fácil ver qué enrutamientos de ruta se han declarado sin contaminarlo con el código impl. – Don

6

No recomendaría una sola aplicación.js en absoluto. Usted terminará con un archivo de línea de más de 5.000 que es una pesadilla para mantener.

El problema más importante que veo con su fragmento de código es que aunque require() se almacena en caché, tiene que realizar una solicitud de IO síncrona. Es un mal hábito entrar.

Similar a lo que Don recomienda, he tenido la mejor suerte de dividir las rutas en módulos que exportan una sola función que acepta una instancia de la aplicación. Se puede pensar en él como "decorar" la instancia aplicación:

// app.js 
var app = express.createServer(); 
app.configure(function(){ //... }); 

require('./foo')(app); 

// foo.js 
exports = module.exports = function(app){ 

    app.get('/whatever', function(req, res){}); 

}; 
+0

Hmmm, veo, pero aún así me exige que registre explícitamente cada una de las rutas en mi app.js. No estoy interesado en hacer eso, quiero que la aplicación genere automáticamente las rutas según mi estructura de archivos. Supongo que estoy buscando una solución que analice la estructura del archivo y genere las rutas en la hora de lanzamiento de node.js. Entonces, todas las rutas y módulos se almacenarán en la memoria (por lo que no existirán problemas síncronos). Básicamente estoy aprendiendo mi segundo fragmento de código. Creo que pasará por todos mis controladores, requerirá los controladores y los almacenará en la memoria. Creo que tiene sentido ... jaja. – pilotguy

0

No creo que no debería haber ningún problema real con un bucle a través del árbol de directorios y la generación de las rutas. Sin embargo, será difícil definir el middleware basado en rutas y otras características de enrutamiento (como las variables en las rutas) de una manera agradable.

Escribí una biblioteca que uso para definir mis rutas de manera declarativa y con una mínima repetición que podría interesarle. Está inspirada en el enrutamiento ingenioso de Rails y es bastante flexible: la idea es construir un hash de rutas y subrutos; también hay instalaciones para definir grupos de rutas, middleware y variables.

https://github.com/cheesun/express-declarative-routing

A pesar de que no genera automáticamente las rutas en base a su estructura de directorios, creo que eso sería una función interesante y bienvenida se agrega a la biblioteca.