2014-05-12 15 views
11

Quindi, mi è stato detto che passare la variabile request eo response in nodeJS è "cattiva pratica". Ma questo significa che la maggior parte del codice deve essere nel file server.js, rendendolo ingombrante e un po 'brutto.Modulazione NodeJS

Come è possibile modularizzare il server nodejs, passando attorno al req/res in modo appropriato ed essere in grado di organizzare il codice in file separati?

Per esempio, vorrei dividere la mia presa di routing, .get e .post in file diversi, ma ancora in grado di utilizzare i parametri di callback in questo modo:

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"); 
}); 

A partire da ora sono tutti in un file e non mi piace.

risposta

7

Penso che ciò che la persona intende con 'passando intorno' era qualcosa di simile (in veloce pianura):

Ovvero, passando le due variabili oltre la prima funzione. Questo è male perché diventa sempre più difficile capire dove finisce effettivamente la chiamata. Un po 'di nel updateSomethingElse può far crollare l'intero castello di carte.

E 'perfettamente ok (in realtà, standard al punto di essere l'impostazione predefinita in espresso) dichiarare che callback altrove (di solito il /routes directory del progetto.)

// app.js 

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

// express stuff... 

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

Poi, in routes/user.js:

0

Non è necessario passare req e res a un altro modulo ma passare le chiamate da altri moduli al routing. Dovrebbe assomigliare.

var someModule = require("./someModule") 

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

se si vuole avere posto ed entrare in un altro modulo si dovrebbe passare riferimento alle app (da espresso()) volta a quel modulo e operare su quello.

Ad esempio:

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); 

e in post/get_handler:

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

Questo video di TJ Holowaychuk (il tizio che ha scritto Express e una tonnellata di altre infrastrutture Node che tutti usiamo) mi ha aiutato a portare la modularizzazione Express al livello successivo. Fondamentalmente puoi creare singole app nelle loro cartelle e consumarle come middleware molto facilmente. Sono riuscito a estendere questa tecnica a socket.io con alcuni trucchi.

http://vimeo.com/56166857

+1

collegamenti supplementari sono impressionanti, ma non devono contenere il nocciolo della vostra risposta. – SomeKittens