2012-11-11 17 views
5

Sto sviluppando la mia prima app Node.js con Socket.IO e tutto è a posto, ma ora l'app si sta lentamente ingrandendo e mi piacerebbe dividere il codice app in diversi file per migliore manutenzioneDivide Node App in diversi file

Ad esempio sto definendo tutti i miei schemi di mangusta e gli instradamenti nel file principale. Sotto ci sono tutte le funzioni per la connessione socket.IO. Ma ora voglio avere un file aggiuntivo per gli schemi, un file aggiuntivo per il routing e uno per le funzioni.

Naturalmente, sono a conoscenza della possibilità di scrivere il mio modulo o caricare un file con require. Questo non ha senso per me, perché non posso lavorare con i vars come app, io o db senza renderli globali. E se li passo a una funzione nel mio modulo, non posso cambiarli. Cosa mi manca? Mi piacerebbe vedere un esempio di come questo viene fatto nella pratica senza l'utilizzo di vars globali.

risposta

14

Sembra che tu abbia un'applicazione highly coupled; è difficile per te dividere il tuo codice in moduli perché parti dell'applicazione che non dovrebbero dipendere l'una dall'altra fanno. Guardando in the principles of OO design può aiutare qui.

Ad esempio, se si dovesse dividere la logica dataabse dall'applicazione principale, si dovrebbe essere in grado di farlo, poiché la logica del database non dovrebbe dipendere da app o io - deve essere in grado di funzionare sulla sua proprio, e si require in altri pezzi della vostra applicazione per usarlo.

Ecco un esempio abbastanza semplice: è più pseudocodice del codice effettivo, poiché il punto è dimostrare la modularità con l'esempio, non scrivere un'applicazione funzionante. È anche solo uno dei tanti, molti modi in cui puoi decidere di strutturare la tua applicazione.

// ============================= 
// db.js 

var mongoose = require('mongoose'); 
mongoose.connect(/* ... */); 

module.exports = { 
    User: require('./models/user'); 
    OtherModel: require('./models/other_model'); 
}; 


// ============================= 
// models/user.js (similar for models/other_model.js) 

var mongoose = require('mongoose'); 
var User = new mongoose.Schema({ /* ... */ }); 
module.exports = mongoose.model('User', User); 


// ============================= 
// routes.js 

var db = require('./db'); 
var User = db.User; 
var OtherModel = db.OtherModel; 

// This module exports a function, which we call call with 
// our Express application and Socket.IO server as arguments 
// so that we can access them if we need them. 
module.exports = function(app, io) { 
    app.get('/', function(req, res) { 
    // home page logic ... 
    }); 

    app.post('/users/:id', function(req, res) { 
    User.create(/* ... */); 
    }); 
}; 


// ============================= 
// realtime.js 

var db = require('./db'); 
var OtherModel = db.OtherModel; 

module.exports = function(io) { 
    io.sockets.on('connection', function(socket) { 
    socket.on('someEvent', function() { 
     OtherModel.find(/* ... */); 
    }); 
    }); 
}; 


// ============================= 
// application.js 

var express = require('express'); 
var sio = require('socket.io'); 
var routes = require('./routes'); 
var realtime = require('./realtime'); 

var app = express(); 
var server = http.createServer(app); 
var io = sio.listen(server); 

// all your app.use() and app.configure() here... 

// Load in the routes by calling the function we 
// exported in routes.js 
routes(app, io); 
// Similarly with our realtime module. 
realtime(io); 

server.listen(8080); 

questo era tutto scritto fuori dalla parte superiore della mia testa con il minimo controllo della documentazione per varie API, ma spero che pianta il seme di come si potrebbe fare per estrarre i moduli dall'applicazione.

+0

Questo è veramente utile per le persone nuove al nodo e alla strutturazione dei moduli in generale. Funziona come un incantesimo e come hai detto, posso vedere come ci potrebbe essere un sacco di modi per farlo. – Deminetix

+0

grazie mille, ha funzionato –