更多的節點問題真的,但可能值得標籤,因爲它被問了一下。所以你說有一個範圍問題,你是正確的,因爲變量是.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