2013-07-22 105 views
3

我對Web開發都很陌生。我試圖讓node.js/express/mongo項目落地。我來自C/C++背景,模塊組織範例對我來說似乎有點奇怪。如何正確解耦MongoDB

目前,在我的server.js中,我使用mongoose創建,連接並初始化我的mongoDB對象,然後繞過此對象查詢,在其上插入ect。似乎不應該在server.js之內做點什麼。

通過創建一個單獨的模塊(例如數據庫),我可以通過這個新模塊執行所有初始化,選項等,並返回一個mongodb實例,從而將Mongo從我的項目中鬆散耦合到適當的方式?

我從來沒有承擔在此之前的大小(或類型)的項目,只是不知道如何以最佳方式組織一切.. 比我更有經驗的任何從這些人的意見,將不勝感激

+0

使用分層和依賴注入。也就是說,有一個獨立的數據訪問模塊,它接收一個MongoDB對象作爲init參數,還有一個單獨的模塊處理這個對象的設置並將它傳遞給數據訪問,然後將數據訪問的東西交給你的控制器。 – millimoose

+0

這當然不是一個明確的答案(並且,鑑於節點程序員傾向於如此自以爲是,我懷疑可能不存在明確答案),但在以下鏈接中有關於此主題的有趣討論:https://gist.github .com/viatropos/1398757,http://rycole.com/2013/01/28/organizing-nodejs-express.html,和http://onoffswitch.net/separation-concerns-node-js/ –

+0

這[github回購](https://github.com/linnovate/mean)有一個如何組織你的MEAN應用程序的好例子,儘管你不會使用AngularJS。 –

回答

2

許多方法來做到這一點。這裏有一些想法。

是的,你會希望有一些路由/處理程序的設置,以便不同的模塊有能力調用不同的服務和/或分離。

下面是一個相當標準的node.js /快遞結構:

├── server.js 
├── config 
│ ├── development 
│ ├── production 
│ └── staging 
├── handlers 
│ ├── customers.js 
│ └── stores.js 
├── node_modules 
│ ├── assert 
│ ├── ejs 
│ ├── express 
│ ├── forever 
│ ├── mongodb 
│ └── mongoskin 
├── package.json 
├── README.md 

然後在server.js,你可以導入你的處理程序,如下所示:

// import route handlers 
var customers = require('./handlers/customers'), 
    stores = require('./handlers/stores'); 

,然後你裏面的處理程序,你就可以申報的功能:

exports.addCustomer = function(req, res) { 
    // .... 
}; 

這server.js您可以使用路由:

app.post('/customers/add/:id, metrics.addCustomer); 

這樣你就有了一個基本框架。只需在處理程序文件中定義exports.XXX函數之外的數據庫連接就沒有問題,因爲這些函數將有權訪問,但server.js中沒有任何內容,因此您不會污染名稱空間。

var url = config.user +":" 
     + config.pass +"@" 
     + config.host +"/" 
     + config.database; 

var mongo = require('mongoskin').db(url); 

您可能會從JSON文件中加載config對象。

希望有幫助。

+0

謝謝你的迴應!看起來像是處理不同請求的好主意。但是,我會用mongo這樣的東西做什麼,或者我使用的模塊會被多個處理程序需要嗎? – gone

+0

在'server.js'中創建它。那麼你可以通過做一些類似於'var customers = require('./ handlers/customers')(mongo_instance)''的方法給'require()'方法提供參數,然後在那裏訪問它。當然有很多方法可以做到這一點,但這是一種直接的方式。 – lollercoaster

+0

嗯有趣的想法。謝謝! – gone