2012-01-06 69 views
5

目前我設置我的客戶端連接的node-mysql做在下面我app.js和特殊config/environment.js我應該在Node.js(Express)應用程序中定義我的MySQL客戶端?

var client = mysql.createClient({ 
    user:  'USER', 
    database: 'DATABASE', 
    password: 'PASSWORD', 
    host:  'HOST' 
}); 

app.configure(function(){ 
    ... 
    app.set('client', client); 
    ... 
}); 

然後在我的客戶端代碼只需要調用app.settings.client使用MySQL客戶端。

我不確定這是否是正確的方法,並且當我進行測試時它肯定不起作用,因爲我需要一個正在運行的應用程序實例。

有什麼建議嗎?

+1

使用'app.set('client')'而不是'app.settings.client'。它應該與測試一起工作,你只需要在你的單元測試中注入一個空的'app'作爲嘲諷的一部分 – Raynos 2012-01-06 19:31:26

+0

@Raynos你如何注入一個空的'app'? – 2012-01-06 19:41:59

+0

取決於您的代碼。 [我做這樣的事情](https://github.com/Raynos/nCore-example/blob/master/test/routes-home.js),但我會假設你的架構完全不同。 – Raynos 2012-01-06 19:45:31

回答

2

有3個解決方案,我看到它的方式:

一)由於@Raynos的意見建議,使用app.set(key, value);設定分貝值,然後app.set(鍵)來獲取價值。
b)將你的路由包裝成一個接受數據庫作爲參數的函數。 例子:

sample_route.js

module.exports = function (db) { 
    return function(req, res, next) { 
    // db is accessible here 
    } 
} 

app.js

var = sample_route = require('./sample_route')(db); 
app.get('/sample', sample_route); 


c)使一個全局變量,這將是無處不在訪問(雖然不推薦): global.MY_DB = ...;

2

我認爲這樣做更典型的方法是定義一個簡單的中間件,它將mysql客戶端設置爲請求的屬性。例如:

var client = mysql.createClient({ 
     user:  'USER', 
     database: 'DATABASE', 
     password: 'PASSWORD', 
     host:  'HOST' 
    }) 

app.use(function(req, res, next) { 
    req.mysql = client; 
    next(); 
}); 

然後在你的路由處理程序可以訪問req.mysql。在你的測試案例中,你只需要以某種方式設置req.mysql,它應該很容易。

+3

太可怕了。你創建一個新的mysql objcet每個請求:( – Raynos 2012-01-06 19:45:51

+0

@Raynos是的,這就是爲什麼我使用'app.set()'。 – 2012-01-06 19:46:54

+1

好吧,以及全球創建客戶端,它仍然方便有req.mysql,似乎適合於與快遞架構傳遞需求,解決方案。 – kgilpin 2012-01-06 19:54:11

相關問題