gpt4 book ai didi

node.js - 围绕 node-mongodb-native 的最小层

转载 作者:可可西里 更新时间:2023-11-01 10:33:41 25 4
gpt4 key购买 nike

我围绕 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 似乎使用一个库来实现 promise ,但我很难理解它。请注意,例如 express.session 需要一个完全可用的连接作为参数(我在这里就是这样做的)。如果不使用连接,您实际上无法确定连接是否已设置。

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

我想,基本想法是“克隆”mongodb API 调用,用代码包装它们以处理未设置“db”变量的可能性。但是......那将如何工作?

如有任何帮助,我们将不胜感激!

雇佣兵。

最佳答案

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

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

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

关于node.js - 围绕 node-mongodb-native 的最小层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com