【发布时间】:2014-05-05 07:04:06
【问题描述】:
我围绕 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”变量未设置的可能性。但是……这将如何运作?
任何帮助将不胜感激!
佣兵。
【问题讨论】:
-
最终,您会遇到绝对需要等待连接完成才能继续的情况。如果没有回调,它将无法工作(因为 MongoClient 需要回调)。您可以使用 Event 来包装它——但这实际上(从概念上)只是一种不同类型的回调。这就是 Mongoose 所做的——当连接准备好时,它会引发一个事件,
open. -
所以没有实际解决方案,真的吗?我试图弄清楚 mongojs 是如何做到的,并继续迷失在代码中......但我猜它没有......!
-
顺便说一句,我将在上面的模块中添加一些简单和基本的功能,并将在 GutHub 中发布...
-
使用 Node.js,没有不涉及事件或回调的解决方案。这是驱动程序中的异步连接。您只需要延迟一些快速设置,直到连接打开。它只需要在应用启动时发生。
-
@WiredPrairie 请添加您的第一个和最后一个 cmets 作为答案,我会接受。