2012-11-11 9 views
5

Pracuję nad moją pierwszą aplikacją Node.js z Socket.IO i wszystko jest w porządku, ale teraz aplikacja powoli się powiększa i chciałbym podzielić kod aplikacji na różne pliki lepsza konserwacja.Aplikacja Divide Node w różnych plikach

Na przykład definiuję wszystkie moje schematy mangusty i trasy w pliku głównym. Poniżej znajdują się wszystkie funkcje połączenia socket.IO. Ale teraz chcę mieć dodatkowy plik dla schematów, dodatkowy plik dla routingu i jeden dla funkcji.

Oczywiście, zdaję sobie sprawę z możliwości napisania własnego modułu lub załadowania pliku z wymaganiem. To po prostu nie ma sensu dla mnie, ponieważ nie mogę pracować z varsami takimi jak app, io czy db bez uczynienia ich globalnymi. A jeśli przekażę je do funkcji w moim module, nie mogę ich zmienić. czego mi brakuje? Chciałbym zobaczyć przykład, jak to robi się w praktyce bez użycia globalnych zmiennych.

Odpowiedz

14

To brzmi jak masz aplikację highly coupled; trudno jest podzielić kod na moduły, ponieważ elementy aplikacji, które nie powinny od siebie zależeć. Patrząc na the principles of OO design może pomóc tutaj.

Na przykład, jeśli chcesz podzielić logikę dataabse z głównej aplikacji, powinieneś być w stanie to zrobić, ponieważ logika bazy danych nie powinna zależeć od app lub io - powinna być w stanie pracować nad jej właścicielem i ty require go do innych części aplikacji, aby go użyć.

Oto dość prosty przykład - jest on bardziej pseudokodowy niż rzeczywisty kod, ponieważ chodzi o pokazanie modułowości poprzez przykład, a nie pisanie działającej aplikacji. To także tylko jeden z wielu sposobów, na jakie możesz zdecydować się na strukturę swojej aplikacji.

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

To wszystko było odpisane czubek mojej głowy przy minimalnej kontroli dokumentacji dla różnych API, ale mam nadzieję, że rośliny nasiona, jak można iść o wydobywaniu z modułów aplikacji.

+0

Jest to bardzo pomocne dla osób, które dopiero zaczynają budować węzły i moduły. Działa to jak czar i jak już powiedziałeś, widzę, jak może być wiele sposobów na zrobienie tego. – Deminetix

+0

wielkie dzięki, zadziałało –

Powiązane problemy