更多的节点问题真的,但可能值得标签,因为它被问了一下。所以你说有一个范围问题,你是正确的,因为变量是.connect()
方法的回调函数的本地,并且在其他任何地方都不可见。一种方法是将所有逻辑转储到回调中,因此没有范围问题,但您可能不希望这样做。
问“我该如何设定一个全球”,也不是真正的正确方法。那么不是直接的,因为有关于分解节点的“异步”模式的一般有趣的事情。因此,更好的方法是使用某种“单例”实例,在该实例中只设置一次连接,但因为这是全局的,或者可能“需要”用于应用程序的其他区域。
这里是一个“微不足道”的方式来证明,但也有很多方法可以做同样的事情:
var async = require('async'),
mongodb = require('mongodb'),
MongoClient = mongodb.MongoClient;
var Model = (function() {
var _db;
var conlock;
return {
getDb: function(callback) {
var err = null;
if (_db == null && conlock == null) {
conlock = 1;
MongoClient.connect('mongodb://localhost/test',function(err,db) {
_db = db;
conlock == null;
if (!err) {
console.log("Connected")
}
callback(err,_db);
});
} else if (conlock != null) {
var count = 0;
async.whilst(
function() { return (_db == null) && (count < 5) },
function(callback) {
count++
setTimeout(callback,500);
},
function(err) {
if (count == 5)
err = new Error("connect wait exceeded");
callback(err,_db);
}
);
} else {
callback(err,_db);
}
}
};
})();
async.parallel(
[
function(callback) {
console.log("call model");
Model.getDb(function(err,db) {
if (err) throw err;
if (db != undefined)
console.log("db is defined");
callback();
});
},
function(callback) {
console.log("call model again");
Model.getDb(function(err,db) {
if (err) throw err;
if (db != undefined)
console.log("db is defined here as well");
callback();
})
}
],
function(err) {
Model.getDb(function(err,db) {
db.close();
});
}
);
这里因此,伸出小“模型”对象在.getDb()
一个方法,也维护一个私有变量,一旦建立连接,就会保留_db
连接。该方法的基本逻辑是看看是否定义了_db
,以及它没有与驱动程序建立连接。在连接回调中,然后设置_db
变量。
这里的另一件事是该方法本身接受一个“回调”,所以这就是你以后如何使用它的地方,在这里将返回一个错误或当前连接。
最后一部分只是代码中实现的两个函数的演示。在第一次调用中,连接到数据库的调用在进入提供的回调函数之前进行。
但是,下一次我们调用时,连接已经设置在私有变量中,因此数据仅仅被返回并且不会再次建立连接。
有很多种方法来实现这种事情,但这是遵循的基本逻辑模式。还有很多其他的“帮手”实现,它们包装MongoDB驱动程序以使这些事情变得简单,并且管理连接池并确保连接也适合您,因此即使您仍然坚持自己从底层司机基地完成所有工作。
我不好,我只是在回调之外声明了一个全局变量global_db。我以为我已经尝试过,并没有工作,但我再次尝试,它这样做,谢谢。 – 2014-08-31 22:45:06
从长远来看,你可能需要做一些更复杂的事情,如尼尔的答案,你可能不想要一个全球化的,但至少你是开始。 – user949300 2014-09-01 00:44:54