7

ここでは、経験豊富なnode.jsプログラマーからの方向性を探しています。私が直面している最大の問題は、変数を別々のモジュールに渡すことです。たとえば、私のserver.jsには、次のものがあります。

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

現在、server.jsファイル内でルートを実行していません。ルートは、独自のファイルに分割されています。したがって、ブログの例では、次のようになります。

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

ここで問題が発生します。各ルートでデータベース接続を設定する必要はありません。言うまでもなく、大量の接続が作成されると思います。これをどのように処理しますか。これについて何も見つからないようで、以前にこの問題が発生したことがあるので、サンプルの「REALWORLD」アプリケーションがあります。ノードがモジュールをキャッシュすることは知っていますが、ノードが独自のモジュールにある場合、接続をキャッシュすることは想像できません。サイト構成を保持する構成モジュールを作成したので、必要な場所でこれを要求しても問題はありません。私がこれをやりたいと思うことは他にもあると思うので、今これを理解するのが最善でしょう。

どんな助けでも大歓迎です。

4

3 に答える 3

3

これを行う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);
};

db接続を必要とするモジュールは、引数としてapp.locals.db取る関数をエクスポートするだけでアクセスできappます(上記のように)。もちろん、エクスプレス以外のものを使用している場合は、これをいくらか変更する必要がありますが、考え方は同じです。

于 2012-10-26T04:51:31.740 に答える
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);
    }
}

redisモジュールを1つ以上のルートモジュールに含め、次のように呼び出すことで、これを使用します。

var db = require('redis');

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

残りはノードモジュールシステムが処理します。

于 2012-10-26T04:59:13.433 に答える
1

エクスプレスを使用していますね。ただ行う:

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

次に、モジュールコンストラクターで、必ずapp変数を渡してください。そうすれば、を使用app.get('db')dbて作業を開始できます。

于 2012-10-26T08:34:40.417 に答える