2012-01-06 14 views
5

は現在、私は私のapp.jsと特別config/environment.jsで以下のようにしてnode-mysqlのための私のクライアント接続を設定しています:MySQLクライアントをNode.js(Express)アプリケーションでどこで定義しますか?

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

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

その後、私のクライアントコードで私はMySQLクライアントを使用するようにapp.settings.clientを呼び出します。

これは適切なアプローチであるかどうかはわかりません。アプリケーションの実行インスタンスが必要なため、テストを行っているときは確かに動作しません。

提案がありますか?

+1

'app.settings.client'の代わりに' app.set( 'client') 'を使います。そして、それはテストでうまくいくはずです、ちょうど空の 'app'をあなたの単体テストに注入する必要があります – Raynos

+0

@Raynos空の' app'をどのように注入しますか? –

+0

はコードによって異なります。 [私はこのようなことをしています](https://github.com/Raynos/nCore-example/blob/master/test/routes-home.js)あなたのアーキテクチャは完全に異なっていると思います。 – Raynos

答えて

2

は3つのソリューション私はそれを見る方法があります。
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を設定する必要があります。

a)は@Raynosはコメントで示唆したように、その値を取得するために)、デシベル値を設定するためにapp.set(key, value);を使用し、app.set(キー:

+3

それは恐ろしいです。リクエストごとに新しいmysql objcetを作成しています:( – Raynos

+0

@Raynosそう、私は 'app.set()'を使用しています。 –

+1

よくクライアントをグローバルに作成します。 req、resを渡すのExpressアーキテクチャで。 – kgilpin

関連する問題