2012-11-11 15 views
5

我正在用Socket.IO開發我的第一個Node.js應用程序,一切都很好,但現在應用程序正在慢慢變大,我想將應用程序代碼分成不同的文件更好的維護。在不同的文件中劃分節點應用程序

例如,我在主文件中定義了所有的貓鼬模式和路由。下面是socket.IO連接的所有功能。但現在我想爲模式有一個額外的文件,一個額外的路由文件和一個用於功能的文件。

當然,我知道有可能編寫我自己的模塊或加載文件require。這對我來說沒有意義,因爲我無法使用像app,io或db這樣的變量而不使它們成爲全局變量。如果我將它們傳遞給模塊中的函數,我無法更改它們。我錯過了什麼?我想看一個例子,這是如何在不使用全局變量的情況下在實踐中完成的。

回答

14

聽起來好像你有一個highly coupled應用程序;你很難將你的代碼分解成模塊,因爲不應該依賴於彼此的應用程序塊。調查the principles of OO design可能會在這裏幫助。

例如,如果要將數據庫邏輯從主應用程序中分離出來,應該可以這樣做,因爲數據庫邏輯不應該依賴於appio - 它應該能夠使用它的自己的,而你require它到你的應用程序的其他部分使用它。

這是一個相當基本的例子 - 它比實際代碼更僞代碼,因爲重點是通過示例演示模塊化,而不是寫一個工作的應用程序。這也只是您決定構建應用程序的許多方法中的一種。

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

這是所有寫了我的頭與各種API的文檔的最小檢查的頂部,但我希望它的植物,你會如何從應用程序解壓模塊的種子。

+0

這對於一般新增節點和模塊結構的人員非常有用。這就像一個魅力,正如你所說,我可以看到如何可以有很多方法來做到這一點。 – Deminetix

+0

非常感謝,它的工作 –

相關問題