2014-05-12 14 views
11

So wurde mir gesagt, dass die Weitergabe der request und response Variable in NodeJS "schlechte Praxis" ist. Aber das bedeutet, dass der meiste Code in der server.js-Datei enthalten sein muss, was ihn überladen und irgendwie hässlich macht.NodeJS Modulization

Wie können Sie Ihren Nodejs-Server modularisieren, req/res entsprechend weitergeben und Ihren Code in separaten Dateien organisieren?

Zum Beispiel würde Ich mag meine Buchse Routing spalten, .get und .post in verschiedene Dateien, aber dennoch in der Lage sein, die Callback-Parameter zu verwenden, etwa so:

app.io.route("disconnect", function(req,res) { <--- these params 
    db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user)); 
    req.io.broadcast("event", {msg:req.session.username+" has logged out!"}); 
    app.io.broadcast("reloadXY"); 
}); 

Ab jetzt sie alle sind in einer Datei und das mag ich nicht.

Antwort

7

Ich denke, was die Person gemeint, die von 'herumgereicht' so etwas wie dies war (im Klar express):

app.get('/kittens', function(req, res) { 
    db.doAthing(req); 
    updateSomethingElse(res); 
    upvoteThisAnswer(res); 
}); 

Das heißt, um die beiden Variablen über die erste Funktion übergeben. Das ist schlecht, weil es immer schwieriger wird herauszufinden, wo der Anruf tatsächlich endet. Ein kleines res.end(500) in updateSomethingElse kann dazu führen, dass das ganze Kartenhaus zusammenstürzt.

Es völlig in Ordnung ist (in der Tat, Standard bis zu dem Punkt der Standard in Express ist), dass Rückruf an anderer Stelle zu erklären (in der Regel das /routes Verzeichnis Ihres Projekts.)

// app.js 

var user = require('./routes/user') 
    , kittens = require('./routes/kittens'); 

// express stuff... 

app.get('/settings', user.getSettings); 
app.get('/fur', kittens.shed); 

Dann in routes/user.js:

0

Sie sollten req und res nicht an andere Module übergeben, sondern Callbacks von anderen Modulen an route weiterleiten. Es sollte wie aussehen.

var someModule = require("./someModule") 

app.get("/someAction", someModule.handleSomeAction) ; 

Wenn Sie wollen Post haben und in einem anderen Modulen erhalten Sie Bezug auf App (von Express()) einmal zu diesem Modul und arbeiten darauf verzichten sollte.

Zum Beispiel:

var express = require("express") ; 
var app = express(); 
var get_handler = require("./get_handler ") 
var post_handler = require("./post_handler ") 

get_handler.init(app); 
post_handler.init(app); 

und in Pfosten/get_handler:

var app; 
exports.init = function(eApp){ 
    app = eApp; 
    // operate on app 
} 
1

Dieses Video von TJ Holowaychuk (der Typ, der Express und eine Tonne anderer Node-Infrastruktur geschrieben hat, die wir alle benutzen) half mir, die Modularisierung von Express auf die nächste Stufe zu bringen. Grundsätzlich können Sie einzelne Apps in eigenen Ordnern erstellen und diese als Middleware sehr einfach konsumieren. Ich habe es geschafft, diese Technik mit einigen Tricks auf socket.io zu erweitern.

http://vimeo.com/56166857

+1

Ergänzende Links sind genial, sollte aber nicht den Kern Ihrer Antwort enthalten. – SomeKittens