2012-12-26 35 views
10

MongoClient文檔說明如何使用服務器實例來創建連接:如何使用服務器實例指定mongodb用戶名和密碼?

var Db = require('mongodb').Db, 
    MongoClient = require('mongodb').MongoClient, 
    Server = require('mongodb').Server; 

// Set up the connection to the local db 
var mongoclient = new MongoClient(new Server("localhost", 27017)); 

你會如何指定此用戶名和密碼?

回答

26

有兩種不同的方法可以做到這一點

#1

Documentation(注意文檔中的示例使用數據庫對象)

// Your code from the question 

// Listen for when the mongoclient is connected 
mongoclient.open(function(err, mongoclient) { 

    // Then select a database 
    var db = mongoclient.db("exampledatabase"); 

    // Then you can authorize your self 
    db.authenticate('username', 'password', function(err, result) { 
    // On authorized result=true 
    // Not authorized result=false 

    // If authorized you can use the database in the db variable 
    }); 
}); 

#2

Documentation MongoClient.connect
Documentation The URL
A我喜歡更多的方式,因爲它更小,更易於閱讀。

// Just this code nothing more 

var MongoClient = require('mongodb').MongoClient; 
MongoClient.connect("mongodb://username:[email protected]:27017/exampledatabase", function(err, db) { 
    // Now you can use the database in the db variable 
}); 
+1

是的,經過一番研究,似乎唯一的方法來驗證是在數據庫級別,而不是服務器。所以這是有道理的。我去了#2。 –

1

感謝Mattias的正確答案。

我想補充一點,有時候你想要連接到另一個數據庫時有證書。 在這種情況下,您仍然可以使用URL方式進行連接,只需在URL中添加?authSource=參數即可。

例如,假設您擁有數據庫admin的管理員憑據,並且想要連接到數據庫mydb。你可以做到這一點通過以下方式:

const MongoClient = require('mongodb').MongoClient; 

(async() => { 

    const db = await MongoClient.connect('mongodb://adminUsername:[email protected]:27017/mydb?authSource=admin'); 

    // now you can use db: 
    const collection = await db.collection('mycollection'); 
    const records = await collection.find().toArray(); 
    ... 

})(); 

另外,如果您的密碼包含特殊字符,你仍然可以使用URL的方式是這樣的:

const dbUrl = `mongodb://adminUsername:${encodeURIComponent(adminPassword)}@localhost:27017/mydb?authSource=admin`; 
    const db = await MongoClient.connect(dbUrl); 

注:在早期版本中,需要{ uri_decode_auth: true }選項(作爲connect方法的第二個參數),當使用encodeURIComponent作爲用戶名或密碼時,但現在這個選項已經過時,沒有它就可以正常工作。

相關問題