2

node-mongodb-nativeラッパーの周りにおそらく最小のラッパーを書きました。でも、改善が必要だと思います。とても小さいので、ここに快適に収まります。

function MongoWrapper() {
  this.db = null;
};

var mongoWrapper;
module.exports = exports = mongoWrapper = new MongoWrapper;

// This means that you can do `new include('mongoWrapper').MongoWrapper()`
mongoWrapper.MongoWrapper = MongoWrapper;

// ObjectId is the most handy method of all. This will work with
// native BSON or Pure BSON
mongoWrapper.ObjectId = function() {
    if (!mongo.BSONNative || !mongo.BSONNative.ObjectID) {
      return function(id) {
            return mongo.BSONPure.ObjectID.createFromHexString(id);
      };
    }
    return function(id) {
            return new mongo.BSONNative.ObjectID(id);
    };
}();

MongoWrapper.prototype.connect = function(url, options, cb ){

  var that = this;
  var MongoClient = mongo.MongoClient;

  MongoClient.connect( url, function( err, db ){

    if( err ) {
      console.log( err );
    } else {
      that.db = db; 
    }
    cb( err, db );
  });
}

さて...これに関する「問題」は、サーバー全体をコールバックでラップする必要があることです。

mw.connect('mongodb://localhost/hotplate', {}, function( err, db ){
    app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    ...
    app.use(express.session({
      // secret: settings.cookie_secret,
      secret: 'woodchucks are nasty animals',
      store: new MongoStore({
        // db: settings.db
        // db: hotplate.get('db').client
         db: db
      })
    }));

他のドライバー(Mongoose、さらにはmongojsなど)は、コールバックの使用を強制しないように管理しています。私は彼らのコードを見ました、そして...まあ、私はそれを完全に理解しませんでした。特にMongojsは約束のためにライブラリを使用しているようですが、私はそれを理解するのに苦労しています。express.sessionたとえば、パラメータとして、完全に機能する接続が必要であることに注意してください(これは私がここで行うことです)。接続を使用しないと、実際に接続が設定されるかどうかを確認することはできません。

だから:コールバックの必要性を取り除くための最も簡単な方法は何ですか?

基本的な考え方は、mongodb API呼び出しを「複製」し、「db」変数が設定されていない可能性を処理するコードでそれらをラップすることだと思います。しかし...それはどのように機能しますか?

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

メルク。

4

2 に答える 2

2

最終的には、接続が非同期であるため続行する前に、接続が完了するのを絶対に待つ必要がある状況に遭遇します。また、コールバックがないと機能しません(MongoClientにはコールバックが必要なため)。

イベントを使用してラップすることもできますが、これは実際には(概念的には)異なるタイプのコールバックです。これがMongooseの機能です。接続の準備ができると、イベントが発生しますopen

Node.jsを使用すると、どこかにイベントまたはコールバックのいずれも含まないソリューションはありません(これは、NodeとMongoDBドライバーの意図的な設計上の選択です)。これは、ドライバーの非同期接続です。接続が開かれるまで、エクスプレスセットアップの一部を遅らせる必要があります。アプリの起動時にのみ発生する必要があります。

于 2013-02-01T23:19:15.910 に答える
0

この質問は少し古いことに気づきますが、私はこの小さなラッパーを使用して「リフティング」を行い、少量の砂糖を使用するので、私のdbコードは少し冗長ではありません。findByIdObjectIdをラップしたり、クエリを実行したりする必要がないfindArrayようtoArray()なものです。見てみな:

https://github.com/dmcaulay/mongo-wrapper

于 2014-05-04T23:04:06.513 に答える