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 需要回调)。

您可以使用 Event 来包装它——但这实际上(从概念上)只是一种不同类型的回调。这就是 Mongoose 所做的——它在连接准备好时引发一个事件,open.

使用 Node.js,没有一个解决方案在某处不涉及事件或回调(这是 Node 和 MongoDB 驱动程序的有意设计选择)。这是驱动程序中的异步连接。您只需要延迟一些快速设置,直到连接打开。它只需要在应用程序启动时发生。

于 2013-02-01T23:19:15.910 回答
0

意识到这个问题有点老了,但我用这个小小的包装器来做“提升”和少量的糖,所以我的数据库代码不那么冗长。findById诸如无需包装 ObjectId 和findArray无需toArray()查询之类的事情。一探究竟:

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

于 2014-05-04T23:04:06.513 回答