2012-10-26 208 views
6

我正在尋找一些經驗豐富的node.js程序員的方向。我遇到的最大問題是將變量傳遞到單獨的模塊中。例如,在我的server.js我有以下幾點:node.js傳遞變量

var db = mongoose.createConnection('localhost','test'); 

現在我沒有運行它們被分成有自己的文件server.js的文件裏我的路線。因此,對於一個博客例如,它可能是這樣的:

app.get('/blog/post/:id',function(req,res){ 
    //do something here 
} 

現在,這是哪裏出了問題進來,我不希望有安裝在我的每個路線的數據庫連接,何況我想。它會造成很多連接。我如何處理這個問題,是否有一個示例「REAL WORLD」應用程序,因爲我似乎無法找到任何關於此的信息,而且我知道以前人們必須遇到此問題。我知道節點緩存模塊,但我不能想象它會緩存連接,因爲它在它自己的模塊中。我創建了一個配置模塊,只保存站點配置,因此需要這個我需要它的地方不是問題。我想還有其他的事情,我想要這樣做,所以現在最好弄清楚這一點。

任何幫助表示讚賞。

回答

3

這是我在我的真實世界的應用程序做什麼。

我有一個名爲redis(這是我使用的數據庫)模塊。它包含以下代碼:

var store; 

exports.store = store = redis.createClient(config.port, config.url); 

所以,我可以直接訪問客戶端,如果需要的話。我幾乎從不這樣做。相同的模塊包含這樣的代碼:

var db = require('redis'); 

db.getData('someData', function(err, result){ 
    console.log(result); // real world code goes here! 
}); 

的節點模塊系統採用的方式:

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

    try{ 
     store.hget(key, dataID, callback); 
    } catch(err){ 
     callback(err); 
    } 
} 

我通過包括在一個或多個路由模塊redis模塊和主叫它像這樣使用該休息。

+0

所以我唯一的問題是這是否創建一個新的連接每次?我已經開始這樣做了,但我想確定它沒有。 – ngreenwood6

+0

它似乎重用現有的連接,如果它有一個。如果連接在不使用時自動丟棄,則會重新連接。 –

2

一種方法是將連接添加爲一個對象的屬性,該對象將會供所有需要它的模塊使用。例如,在我的快遞軟件,我有這樣的事情在我的主要的應用程序文件:

require('./config/database')(app); 

config/database文件看起來像:

var mongoose = require('mongoose'); 

module.exports = function(app) { 
    var database = app.get('env'); 
    var uri = database === 'production' ? 'something...' : 'localhost'; 
    return app.locals.db = mongoose.createConnection(uri, database); 
}; 

需要一個數據庫連接的任何模塊,然後可以訪問app.locals.db簡單通過導出一個以app作爲參數的函數(就像上面一樣)。當然,如果你使用的不是快遞以外的東西,你需要稍微修改一下,但這個想法保持不變。

+0

非常有創意的解決方案,但我認爲那種雲當地人。這絕對是有用的,雖然自動將數據傳遞給本地人 – ngreenwood6

+0

我認爲這就是'app.locals'。我通過遞歸自動加載並將應用程序的所有主要組件分配到'app.locals'的屬性 - 例如我所有的模型都在'app.locals.models'中。我喜歡這種模式有兩個原因:首先,我的模塊獨立於文件結構工作,也就是說,我不需要在所有地方編寫像require('../../ models/user')這樣的東西。其次,我的共享庫可用於視圖 - 例如如果我有'app.locals.lib.urlFor',我可以在視圖中將它用作'lib.urlFor'。 –

+0

是的,就像我說的我認爲它有它的用途(特別是對於配置或實用程序),但我喜歡能夠只需要的數據庫。感謝雖然對於輸入您提出了一個真正有效的要求 – ngreenwood6

1

您正在使用快遞,我明白了。只要做到:

app.set('db', mongoose.createConnection('localhost','test')) 

然後在任何模塊構造,確保傳遞app變量,你可以使用app.get('db')得到db工作。

+0

感謝您的回覆,但我認爲其他解決方案更適合。然後我的模塊可以更通用,它看起來更乾淨。 – ngreenwood6