2012-05-20 7 views
7

Ich bin immer noch meinen Kopf um Knoten, aber ich habe eine sehr einfache Frage. Ich sehe eine Menge von Knotenbeispielen, bei denen Leute ihre Routen und ihre gesamte Logik in einer einzigen app.js-Datei deklarieren (oder sie manchmal in Unterdateien aufteilen).Node.js, restify und richtiges Routing

Meine Frage ist im Grunde: ist es besser, alle Ihre Routen Deklarationen in der App oder Bootstrap eine generische Route, die auf Ihre Dateistruktur zuordnet. Dies mag wie eine primitive Frage erscheinen, aber mein Ziel ist es zu erfassen, was innerhalb von Knoten am effizientesten ist.

Ich baue gerade einen API-Handler mit Restify, aber ich habe eine andere App, die Express verwendet (diese Frage wird wahrscheinlich beide Fragen beantworten).

In meiner Route kann ich entweder eine einzelne Route Bootstrap wie so erklärt:

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

Dieser übernimmt grundsätzlich alle Anrufe aus der API und zielt auf die richtigen api-Controller. Alternativ kann ich jede Route einzeln deklarieren oder vielleicht sogar eine Schleife schreiben, die jeden meiner Controller durchläuft und sie auf init deklariert. Also:

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 ist ein Array aller möglichen Steuerungen. Beachten Sie, dass der obige Code nicht korrekt ist. Ich habe eine HMVC-Ordnerstruktur, daher ist der Code ein wenig komplizierter als der obige Code. Aber Sie verstehen es.

Ich frage mich, was die Konsequenzen von beiden sind und ob es wirklich wichtig ist?

Danke!

Antwort

3

Die explodierende app.js-Datei veranlasste einige von uns, eine kleine Referenz-App zu erstellen, um eine Standard-Express-App-Struktur zu kodieren. Es ist keine Hexerei, sondern eine Reihe von Konventionen, die die Dinge organisierter machen.

Sie können es hier finden: https://github.com/EAAppFoundry/tableau

Wir Liebe Vorschläge würden/Anfragen ziehen, wenn es etwas, was wir falsch verstanden oder fehlt.

+0

Danke Don, das ist ein interessantes Beispiel, das ihr da habt. Aber ich denke, meine Hauptfrage ist noch nicht gelöst. In deiner App definierst du jede der Routen explizit in routes.js. Ich möchte das automatisch generieren, damit ich die Routen nicht manuell definieren muss. – pilotguy

+1

magisches Zeug neigt dazu, mich zu erschrecken .. :) Wir gingen mit den routes.js b/c es war explizit. es macht es einfach zu sehen, welche Route Übereinstimmungen deklariert wurden, ohne sie mit dem Impl-Code zu verschmutzen. – Don

6

Ich würde nicht eine einzige app.js überhaupt empfehlen. Sie werden mit einer Datei mit mehr als 5.000 Zeilen enden, was ein Albtraum ist, der beibehalten werden muss.

Das größte Problem, das ich mit Ihrem Snippet sehe, ist, dass, obwohl require() zwischengespeichert wird, es eine synchrone EA-Anfrage durchführen muss. Es ist nur eine schlechte Angewohnheit, hineinzugehen.

Ähnlich wie Don empfiehlt, hatte ich das Glück, Routen in Module zu teilen, die eine einzelne Funktion exportieren, die eine Instanz der App akzeptiert. Sie können daran denken als „Dekoration“, um die App-Instanz:

// 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, ich sehe, aber es erfordert immer noch, dass ich explizit jede der Routen in meiner app.js registriere. Ich bin nicht scharf darauf, ich möchte, dass die App die Routen abhängig von meiner Dateistruktur automatisch generiert. Ich denke, ich suche nach einer Lösung, die die Dateistruktur analysiert und die Routen bei der Startzeit von node.js generiert. Dann werden alle Routen und Module im Speicher gespeichert (es gibt also keine synchronen Probleme). Im Grunde lerne ich mein zweites Code-Snippet weiter. Ich denke, dass es alle meine Controller durchläuft, die Controller erfordert und sie im Speicher speichert. Ich denke, das macht Sinn ... lol. – pilotguy

0

Ich glaube nicht, dass es mit Looping durch den Verzeichnisbaum ein wirkliches Problem sein soll und die Routen zu erzeugen. Es wird jedoch schwierig sein, routenbasierte Middleware und andere Routing-Funktionen (wie etwa Variablen in den Routen) auf eine nette Weise zu definieren.

Ich habe eine Bibliothek geschrieben, die ich benutze, um meine Routen deklarativ und mit minimalen Wiederholungen zu definieren, die Sie interessieren könnten. Sie ist von Rails findigem Routing inspiriert und ist ziemlich flexibel - die Idee besteht darin, einen Hash von Routen und Unterrouten zu erstellen; Es gibt auch Möglichkeiten, Gruppen von Routen, Middleware und Variablen zu definieren.

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

Obwohl es nicht automatisch die Routen auf die Verzeichnisstruktur auf Basis erzeugen ist, denke ich, dass ein cooles Feature sein würde und empfangen Sie es in die Bibliothek hinzufügen.