Node.js 节点mongodb native周围的最小层

Node.js 节点mongodb native周围的最小层,node.js,mongodb,Node.js,Mongodb,我编写了节点mongodb本机包装器周围可能最小的包装器。但是,我觉得它需要改进。 它非常小,非常适合这里: function MongoWrapper() { this.db = null; }; var mongoWrapper; module.exports = exports = mongoWrapper = new MongoWrapper; // This means that you can do `new include('mongoWrapper').MongoWrap

我编写了节点mongodb本机包装器周围可能最小的包装器。但是,我觉得它需要改进。 它非常小,非常适合这里:

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,甚至MongoJ)设法不强制使用回调。我看了他们的代码,然后。。。嗯,我不太明白。Mongojs似乎特别使用一个库来实现承诺,但我很难理解它。 请注意,例如,
express.session
需要一个完全工作的连接作为参数(我在这里就是这么做的)。如果不使用连接,您实际上无法确保将设置连接

那么:什么是消除回调需求的最简单方法

我认为,基本思想是“克隆”mongodb API调用,用代码包装它们,以处理“db”变量未设置的可能性。但是那怎么办

任何帮助都将不胜感激


Merc.

最终,您会遇到这样的情况:您完全需要等待连接完成,然后才能继续,因为它是异步的。如果没有回调,它将无法工作(因为MongoClient需要回调)

您可以使用事件来包装它——但这只是一种不同类型的回调(概念上)。这就是Mongoose所做的——当连接就绪时,它会引发一个事件,
open


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

意识到这个问题有点老了,但我使用这个小小的包装器来“提升”和少量的糖,所以我的db代码就不那么冗长了。类似于
findById
而不必包装ObjectId,以及
findArray
而不必
toArray()
查询。请查看:


最终,您会遇到这样的情况:在继续之前,您绝对需要等待连接完成。如果没有回调,它将无法工作(因为MongoClient需要回调)。您可以使用事件来包装它——但这只是一种不同类型的回调(概念上)。这就是Mongoose所做的——它在连接准备就绪时引发一个事件,
打开。
所以没有实际的解决方案,是吗?我正试图弄明白mongojs是如何做到的,并继续迷失在代码中。。。但我想它不会。。。!顺便说一句,我将为上面的模块添加一些简单和基本的功能,并将在GutHub中发布它……使用Node.js,没有一个解决方案不涉及事件或回调。它是驱动程序中的异步连接。您只需要将一些快速设置延迟到连接打开之后。这只需要在应用程序启动时发生。@wiredparie请添加您的第一条和最后一条评论作为答案,我将接受。