2012-05-20 5 views
7

Sto ancora spostando la testa sul nodo, ma ho una domanda molto semplice. Vedo molti esempi di nodi in cui le persone dichiarano i loro percorsi e tutta la loro logica in un singolo file app.js (oa volte li divide in sottofile).Node.js, restify e routing corretto

La mia domanda è fondamentalmente: è meglio conservare tutte le dichiarazioni di percorso nell'app o eseguire il bootstrap di un percorso generico che si associa alla struttura del file. Questa può sembrare una domanda primitiva, ma il mio obiettivo è quello di comprendere ciò che è più efficiente all'interno del nodo.

Attualmente sto costruendo un gestore di API con Restify ma ho un'altra app che usa Express (quindi questa domanda probabilmente risponderà ad entrambe le domande).

Nel mio percorso ho possibile dichiarare una singola bootstrap percorso in questo 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(); 
}); 

accetta questo in sostanza tutte le chiamate dal API e gli obiettivi del controller api corretta. In alternativa, posso dichiarare ogni percorso singolarmente o forse anche scrivere un ciclo che attraversa ciascuno dei miei controller e li dichiara su init. Quindi:

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 essendo una matrice di tutti i controller possibili. Nota che il codice sopra non è accurato, ho una struttura di cartelle HMVC quindi il codice è un po 'più complicato di quanto sopra. Ma hai capito il punto.

Mi chiedo quali sono le conseguenze di entrambi e se davvero conta davvero?

Grazie!

risposta

3

L'esplosione del file app.js ha richiesto a noi due di creare una piccola app di riferimento per codificare una struttura di app Express standard. Non è scienza missilistica, ma piuttosto un insieme di convenzioni che rende le cose più organizzate.

Lo si può trovare qui: https://github.com/EAAppFoundry/tableau

saremmo suggerimenti amore/pull richieste se c'è qualcosa che abbiamo ottenuto sbagliato o è mancante.

+0

Grazie Don, questa è una caldaia interessante che voi ragazzi avete lì. Comunque credo che la mia domanda principale non sia ancora risolta. Nella tua app definisci esplicitamente ciascuno dei percorsi in routes.js. Voglio generare questo automaticamente, quindi non devo definire manualmente i percorsi. – pilotguy

+1

roba magica tende a spaventarmi .. :) Siamo andati con i percorsi.js b/c era esplicito. rende facile vedere quali corrispondenze sono state dichiarate senza inquinarlo con il codice impl. – Don

6

Non raccomanderei affatto una sola app.js. Finirai con un file di 5.000 righe che è un incubo da mantenere.

Il problema più grande che vedo con lo snippet è che anche se require() viene memorizzato nella cache, deve eseguire una richiesta di I/O sincrona. È solo una brutta abitudine entrare.

Simile a ciò che Don consiglia, ho avuto la fortuna di suddividere i percorsi in moduli che esportano una singola funzione che accetta un'istanza dell'app. Si può pensare ad esso come "decorazione" l'istanza di applicazione:

// 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, vedo ma mi richiede ancora di registrare esplicitamente ciascuno dei percorsi nella mia app.js. Non sono entusiasta di farlo, voglio che l'app generi automaticamente le rotte a seconda della mia struttura di file. Credo che sto cercando una soluzione che analizzi la struttura del file e generi i percorsi al momento del lancio di node.js. Quindi tutti i percorsi e i moduli saranno archiviati in memoria (quindi non ci saranno problemi sincroni). Fondamentalmente sto imparando il mio secondo snippet di codice. Penso che passerà in rassegna tutti i miei controller, richiede i controller e li memorizza. Penso che abbia senso ... lol. – pilotguy

0

Non credo che ci dovrebbe essere alcun problema reale con loop attraverso l'albero delle directory e generando i percorsi. Tuttavia, sarà difficile definire il middleware basato su route e altre funzionalità di routing (come le variabili nei percorsi) in un modo piacevole.

Ho scritto una libreria che uso per definire i miei percorsi in modo dichiarativo e con una ripetizione minima a cui potresti essere interessato. È ispirata al routing di Rails ed è piuttosto flessibile - l'idea è di costruire un hash di route e subroutes; ci sono anche servizi per definire gruppi di percorsi, middleware e variabili.

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

Anche se non genera automaticamente i percorsi, sulla base di struttura di directory, penso che sarebbe una caratteristica fredda e benvenuto si aggiunge alla libreria.