2012-10-26 12 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 
} 

今、これは私が私が思うだろうセットアップに私のルートのそれぞれにおけるデータベース接続を持っている必要はありませんし、しないように言及しています。それは1トンの接続を作るだろうということです。私はこれをどう扱うのですか?これについて何かを見つけることができないので、サンプル "REAL WORLD"アプリケーションがそこにあります。私は人々がこの問題を以前に持っていなければならないことを知っています。私はノードがモジュールをキャッシュしていることを知っていますが、それが自分のモジュール内にあったとしても接続をキャッシュすることはできません。私はちょうど私がそれが問題ではない必要がある場所を必要とするので、サイトの設定を保持する設定モジュールを作成しました。私はこれをやりたいと思うことが他にもあると思うので、今これを理解することが最善です。

何か助けていただければ幸いです。

答えて

3

ここで私は実際の世界のアプリで何をしています。

私はモジュールredis(これは私が使っているデータベースです)を持っています。以下のコードが含まれています。

var store; 

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

私は、必要に応じてクライアントに直接アクセスできます。私はほとんどそれをしない。同じモジュールは、このようなコードが含まれています

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

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

私は1つのまたは複数のルートモジュール内redisモジュールを含むと、このようにそれを呼び出すことで、これを使用します。

var db = require('redis'); 

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

ノードモジュールシステムは、の世話をします残り。

+0

私の唯一の質問はこれが毎回新しい接続を作成するのですか?私は実際にこれをやって始めましたが、私は確信していません。 – ngreenwood6

+0

既存の接続があれば再利用しているようです。接続が使用されていないときに自動的にドロップされた場合、接続は再接続されます。 –

2

これを行う1つの方法は、接続を必要とするすべてのモジュールで使用できるオブジェクトのプロパティとして接続を追加することです。例えば、私の急行アプリで私は私のメインのアプリのファイルでこのようなものがあります:

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をとる関数をエクスポートします。 express以外のものを使用している場合は、これをいくらか変更する必要がありますが、考え方は変わりません。

+0

非常に創造的な解決策ですが、私はその種の雲が地元の人々だと思います。これは確かに地元の人々に自動的にデータを渡すのに役立つものです – ngreenwood6

+0

私はそれが 'app.locals'があると思います。私は現在のプロジェクトで、アプリケーションの主要なコンポーネントすべてを再帰的に自動読み込みして、 'app.locals'のプロパティに割り当てることで、これを極限まで引き上げました。私のすべてのモデルは 'app.locals.models'にあります。私はこのパターンが2つの理由で好きです:まず、私のモジュールはファイル構造から独立して動作します。つまり、 'require( '../../ models/user')'のようなものを書く必要はありません。次に、私の共有ライブラリがビューに表示されます。 'app.locals.lib.urlFor'があれば、' lib.urlFor'としてビュー内で使うことができます。 –

+0

ええ、私はそれが(特に設定やユーティリティのために)その用途を持っていると思っていたようだが、私はちょうど必要とすることができるのが好きです。お手数ですが、入力のために本当に有効なポイントを作成しました – ngreenwood6

1

あなたは急行を使用しています。ただ、やる:

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

は、次に任意のモジュールのコンストラクタで、 app変数を渡していることを確認してください、あなたは dbが仕事を得るために app.get('db')を使用することができます。

+0

返信いただきありがとうございますが、私は他のソリューションがはるかに良いと思います。その後、私のモジュールはより一般的になり、ちょうどきれいに見えます。 – ngreenwood6