2012-11-11 3 views
5

Ich entwickle meine erste Node.js App mit Socket.IO und alles ist gut, aber jetzt wird die App langsam größer und ich möchte den App-Code in verschiedene Dateien für teilen bessere Wartung.Divide Node App in verschiedenen Dateien

Zum Beispiel definiere ich alle meine Mongoose-Schemas und die Routings in der Hauptdatei. Darunter befinden sich alle Funktionen für die Socket.IO-Verbindung. Aber jetzt möchte ich eine extra Datei für die Schemas haben, eine extra Datei für das Routing und eine für die Funktionen.

Natürlich bin ich mir der Möglichkeit bewusst, mein eigenes Modul zu schreiben oder eine Datei mit require zu laden. Das macht für mich keinen Sinn, weil ich nicht mit den Vars wie app, io oder db arbeiten kann, ohne sie global zu machen. Und wenn ich sie an eine Funktion in meinem Modul weitergebe, kann ich sie nicht ändern. Was vermisse ich? Ich würde gerne ein Beispiel sehen, wie dies in der Praxis getan wird, ohne globale Vars zu verwenden.

Antwort

14

Es klingt wie Sie eine highly coupled Anwendung haben; Es ist schwierig für Sie, Ihren Code in Module zu zerlegen, weil Teile der Anwendung, die nicht aufeinander angewiesen sein sollten, dies tun. Ein Blick in the principles of OO design kann hier helfen.

Zum Beispiel, wenn Sie Ihre Dataabse Logik aus der Hauptanwendung aufteilen sollten, sollten Sie in der Lage sein, dies zu tun, da die Datenbanklogik nicht von app oder io abhängen sollte - es sollte in der Lage sein, daran zu arbeiten eigene und Sie require es in andere Teile Ihrer Anwendung, um es zu verwenden.

Hier ist ein ziemlich einfaches Beispiel - es ist mehr Pseudocode als der tatsächliche Code, da der Punkt ist, Modularität durch Beispiel zu demonstrieren, nicht eine funktionierende Anwendung zu schreiben. Es ist auch nur eine von vielen, vielen Möglichkeiten, wie Sie Ihre Anwendung strukturieren können.

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

Das war alles von der Oberseite meines Kopfes mit minimaler Kontrolle der Dokumentation für verschiedene APIs abgeschrieben, aber ich hoffe, dass es Pflanzen, die Samen, wie Sie über das Extrahieren Module aus der Anwendung gehen könnten.

+0

Dies ist wirklich hilfreich für Leute, die neu in der Knoten- und Modulstrukturierung sind. Das funktioniert wie ein Zauber und wie du gesagt hast, kann ich sehen, wie es viele Möglichkeiten gibt, dies zu tun. – Deminetix

+0

vielen Dank, es hat funktioniert –

Verwandte Themen