如何連接數據庫?
爲了使用你需要做類似下面的MongoDB的原生驅動程序連接:
var util = require('util');
var mongodb = require('mongodb');
var client = mongodb.MongoClient;
var auth = {
user: 'username',
pass: 'password',
host: 'hostname',
port: 1337,
name: 'databaseName'
};
var uri = util.format('mongodb://%s:%[email protected]%s:%d/%s',
auth.user, auth.pass, auth.host, auth.port, auth.name);
/** Connect to the Mongo database at the URI using the client */
client.connect(uri, { auto_reconnect: true }, function (err, database) {
if (err) throw err;
else if (!database) console.log('Unknown error connecting to database');
else {
console.log('Connected to MongoDB database server at:');
console.log('\n\t%s\n', uri);
// Create or access collections, etc here using the database object
}
});
一個基本的連接設置這樣的。這就是我可以給你的只是你想要的基本描述。發佈一些你到目前爲止獲得更多具體幫助的代碼。
我應該在每個文件中創建一個連接並使用它們嗎?
號
那麼,如何創建一個連接池,並在所有的collections.js文件使用它?
你可以用上面的代碼創建一個單獨的文件,我們把它叫做dbmanager.js
連接到數據庫。導出功能如createUser
,deleteUser
等這對數據庫進行操作,那麼像這樣導出功能:
module.exports = {
createUser: function() { ; },
deleteUser: function() { ; }
};
然後你可以從require
像這樣另一個文件:
var dbman = require('./dbmanager');
dbman.createUser(userData); // using connection established in `dbmanager.js`
編輯:因爲我們正在處理JavaScript和一單線程,本地驅動程序確實自動爲您處理連接池。你可以在下面的StackOverflow鏈接中查找,以獲得更多的確認。 OP也在這個問題中陳述了這一點。這意味着client.connect
應該只被您的服務器的一個實例調用一次。在從client.connect
的調用中成功檢索到database
對象之後,該database
對象應該在整個應用程序的整個實例中重用。這很容易通過使用Node.JS提供的模塊模式來完成。
我的建議是創建一個模塊或一組模塊作爲與數據庫交互的單一聯繫點。在我的應用程序中,我通常有一個模塊,它取決於本地驅動程序,調用require('mongodb')
。我的應用程序中的所有其他模塊不會直接訪問數據庫,而是所有操作都必須由此數據庫模塊進行協調。
這將所有處理本地驅動程序的代碼封裝到一個模塊或一組模塊中。 OP似乎認爲我發佈的簡單代碼示例存在一個問題,在我的示例中描述了一個「單個大閉包」的問題。這是非常基本的東西,所以我在這裏添加了關於基本架構的說明,但我仍然不覺得需要更改任何代碼。
OP也似乎認爲可能在這裏創建多個連接。這是不可能的這種設置。如果你創建了一個像我上面建議的模塊,那麼第一次調用require('./dbmanager')
就會執行文件dbmanager.js
和中的代碼返回module.exports
對象。導出對象被緩存,並在每次後續調用require('./dbmanager')
時返回,但dbmanager.js
中的代碼僅執行第一個require
。
如果您不想創建一個像這樣的模塊,那麼另一種選擇是僅導出傳遞給client.connect
的回調的database
,並將其直接用於整個應用的不同位置。不過,我建議反對這一點,不管OP的擔憂。
類似,可能重複#1的問題,其中包括:
我已經考慮過你給出的解決方案,但沒有繼續,因爲正如我上面所說的,我有大約6個集合以及不得不將所有操作寫在一個大閉包內的想法。其次,在您的方法中,有可能會建立多個連接,因爲它不會檢查是否已連接。 –
無論您需要多少次(./ dbmanager),它都不會多次調用client.connect。如果運行多個服務器實例,多個連接的唯一「機會」就是如此。 Node.JS將只在第一次需要時才執行代碼,每次後續調用只返回'exports'。 –
-1缺乏解釋。與你的評論相反,你從來沒有提到任何關於你的問題中的單一封閉。我特別回答你的每個問題:他們關於你是否應該在多個不同的文件中創建連接。我支持我的回答:沒有必要。 –