节点mongodb-native周围的最小层

我写了可能是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 ); }); } 

现在…与这个“问题”是,我需要包裹我的整个服务器在callback:

 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)pipe理不强制使用callback。 我看着他们的代码,呃,我不太明白。 特别是Mongojs似乎使用图书馆作为承诺,但我无法理解它。 请注意,例如express.session需要一个完整的连接(这是我在这里所做的)作为参数。 如果不使用连接,实际上不能确定连接将被设置。

那么,摆脱回拨需求的最简单方法是什么?

我想,基本的想法是“克隆”mongodb API调用,用代码包装它们来处理“db”variables未被设置的可能性。 但是…这将如何工作?

任何帮助将不胜感激!

芝加哥商业交易所。

最终,你会遇到这样的情况,你必须等待连接完成才能继续,因为它是asynchronous的。 没有callback,它将无法工作(因为MongoClient需要callback)。

你可以使用一个事件来包装它 – 但这只是一个不同types的callback(概念上)。 这就是mongoose所做的事情 – 当连接准备就绪时,会引发一个事件。

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

意识到这个问题有点老,但是我用这个小小的包装来做“提升”和less量的糖,所以我的db代码有点不那么冗长。 像findById这样的findById而不必包装ObjectId和findArray而不必toArray()查询。 一探究竟:

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