2015-06-22 53 views
1

我將NodeJS和MongoDB一起使用,並將mongoDB對象傳遞給我的所有原型函數時遇到了一些問題。我不明白如何在這些原型之間傳遞這個對象。也許有人可以指出我正確的方向?如何將mongoDB對象傳遞給Javascript/JS.Node中的所有原型函數?

在我的主文件中,我創建了一個新的mongoDB對象實例,其中包含我想用於使用mongoDB的所有原型。然後我使用原型函數來連接並創建一個新的集合。

Main.js 

var mongo = require('./database/mongoDB') 
var mongoDB = new mongo(); 
// Connect to database 
mongoDB.ConnectDB(dbPath); 
// Create a collection 
mongoDB.CreateNewCollection("Usernames"); 

原型功能在MongoDB.js定義

MongoDB.js 
// Get mongoDB 

var mongoDB = require('mongodb').MongoClient; 
var DatabaseOperations = function() {}; // Constructor 

DatabaseOperations.prototype.ConnectDB = function(dbPath){ 
// Connect to database 
mongoDB.connect(dbPath, function(err, mongoDatabase) { 
if(!err) { 
    console.log("Connected to database: " + dbPath); 
    mongoDB.database = mongoDatabase; 
} else { 
    console.log("Could not connect to database, error returned: " + err); 
} 
}); 
} 

DatabaseOperations.prototype.CreateNewCollection = function(collectionName){ 
mongoDB.database.createCollection(collectionName, function(err, collectionName){ 
if(!err) { 
    console.log("Successfully setup collection: " + collectionName.Username); 
    mongoDB.collectionName = collectionName; 
} else { 
    console.log("Could not setup collection, error returned: " + err); 
} 
}); 
} 

我能夠連接到數據庫,但是從那裏,我不知道如何通過數據庫對象的其他功能樣機爲了創建一個集合或做任何其他的事情。我運行它時得到的錯誤消息是:

mongoDB.database.createCollection(collectionName, function(err, collection 
TypeError: Cannot read property 'createCollection' of undefined 

如何將數據庫對象放入每個原型函數中以使用它?

+0

在'mongoDB.connect'的異步回調執行之前,您是否調用'DatabaseOperations.prototype.CreateNewCollection'? –

+0

嗨帕特里克,不,我沒有在回調之前調用它,我在調用CreateNewCollections原型之後首先調用mongoDB.connect()。我嘗試在mongoDB.database中保存名爲mongoDatabase的新數據庫對象,但是從那裏開始,我無法通過全局變量訪問它,也沒有通過將值返回給main.js並將其作爲參數傳遞給CreateNewCollections.prototype ... – Benny

回答

1

我看到你找到了另一種解決方案,但我仍然要評論。構造函數中的你應該做一些像

MongoDB.js 
// Get mongoDB 

var mongoDB = require('mongodb').MongoClient; 
var DatabaseOperations = function() {}; // Constructor 

DatabaseOperations.prototype.ConnectDB = function(dbPath){ 
// Connect to database 
var that = this; 
mongoDB.connect(dbPath, function(err, mongoDatabase) { 
if(!err) { 
    console.log("Connected to database: " + dbPath); 
    that.database = mongoDatabase; 
} else { 
    console.log("Could not connect to database, error returned: " + err); 
} 
}); 
} 

DatabaseOperations.prototype.CreateNewCollection = function(collectionName){ 
this.database.createCollection(collectionName, function(err, collectionName){ 
if(!err) { 
    console.log("Successfully setup collection: " + collectionName.Username); 
} else { 
    console.log("Could not setup collection, error returned: " + err); 
} 
}); 
} 

這樣,要指定數據庫的DatabaseOperations,和DatabaseOperations的每一個函數原型將不得不通過this.database訪問它。數據庫現在是該對象的一個​​屬性。一般來說,不同的功能只能看到分配給'this'的東西(DatabaseOperations)。

+0

好吧,這對我有意義,但是,爲什麼我不能這樣做:「this.database = mongoDatabase」?它不會將數據庫對象指定爲類對象的屬性嗎? – Benny

+0

其實不是。這是關於上下文的。由於mongoDB.connect是異步的,因此將使用上下文作爲mongoDB對象而不是DatabaseOperations對象來調用其回調函數,我們要爲其分配屬性。一般來說它是一個標準的方案來做「var that = this」,這樣你就可以訪問async回調裏面的對象。 編輯:爲了更清楚地說明'this'裏面mongoDB.connect === mongoDB –

+0

感謝您的解釋,現在對我來說這很有意義! ;-) – Benny