如何使用Node.js连接MongoDB(并进行身份验证)?

78

我该如何使用node.js连接mongodb?

我已经有了node-mongodb-native驱动程序。

显然没有任何文档。

是这样吗?

var mongo = require('mongodb/lib/mongodb'); 
var Db= new mongo.Db( dbname, new mongo.Server( 'mongolab.com', 27017, {}), {}); 

我该把用户名和密码放在哪里?

还有,我该如何插入内容?

谢谢。


1
好的起点是http://christiankvalheim.com/和https://github.com/christkv/node-mongodb-native。话虽如此,我正在撰写适当的文档,以便为驱动程序的v1版本做准备,这将是第一个官方支持的10gen版本。 - christkv
14个回答

43

根据源代码

连接后:

Db.authenticate(user, password, function(err, res) {
  // callback
});

6
我无法相信这个带有语法错误的答案居然得到了这么多的赞... 回调函数定义不合规。请查看我的解决方案和更为适当的源链接:https://dev59.com/-m445IYBdhLWcg3w0NSu#15191273 - mattdlockyer
我最初尝试了这个,但它没有起作用,那是因为我使用方法不对。我在管理员中使用了我的用户凭据。我专门为数据库创建了一个用户并使用了那些凭据。效果非常好。谢谢! - Robert Broden
自驱动程序版本3.1起,Db不再具有authenticate方法。请参阅http://mongodb.github.io/node-mongodb-native/3.1/api/Db.html。 - toadead

38
每个人都应该使用这个源链接:

http://mongodb.github.com/node-mongodb-native/contents.html

问题的答案:

var Db = require('mongodb').Db,
    MongoClient = require('mongodb').MongoClient,
    Server = require('mongodb').Server,
    ReplSetServers = require('mongodb').ReplSetServers,
    ObjectID = require('mongodb').ObjectID,
    Binary = require('mongodb').Binary,
    GridStore = require('mongodb').GridStore,
    Code = require('mongodb').Code,
    BSON = require('mongodb').pure().BSON,
    assert = require('assert');

var db = new Db('integration_tests', new Server("127.0.0.1", 27017,
 {auto_reconnect: false, poolSize: 4}), {w:0, native_parser: false});

// Establish connection to db
db.open(function(err, db) {
  assert.equal(null, err);

  // Add a user to the database
  db.addUser('user', 'name', function(err, result) {
    assert.equal(null, err);

    // Authenticate
    db.authenticate('user', 'name', function(err, result) {
      assert.equal(true, result);

      db.close();
    });
  });
});

6
为什么您总是要将用户添加到数据库中? - bruno nery
这是一个示例,复制自我发布的驱动程序手册链接...连接方法是有用的部分。 - mattdlockyer
仅供参考,希望能帮助到某些人。这不起作用,因为 null != {},并且此检查失败:assert.equal(null, err); - Daniele Vrut
也许手册中的示例现在已经过时了,Mongo有一个更新的版本,感谢提供信息! - mattdlockyer

16
var mongo = require('mongodb');
var MongoClient = mongo.MongoClient;    
MongoClient.connect('mongodb://'+DATABASEUSERNAME+':'+DATABASEPASSWORD+'@'+DATABASEHOST+':'DATABASEPORT+'/'+DATABASENAME,function(err, db){  
      if(err) 
        console.log(err);
      else
      {
        console.log('Mongo Conn....');

      }
    });
//for local server 
//in local server DBPASSWOAD and DBusername not required
MongoClient.connect('mongodb://'+DATABASEHOST+':'+DATABASEPORT+'/'+DATABASENAME,function(err, db){  
      if(err) 
        console.log(err);
      else
      {
        console.log('Mongo Conn....');

      }
    });

完美...谢谢...你刚才使用了连接运算符 '@'+DATABASEHOST+':' + DATABASEPORT @Viral Patel - Prashant

9
我发现使用Mongo的URL很方便。我将URL存储在环境变量中,并使用该变量配置服务器,而开发版本则使用没有密码的默认URL。
URL的格式如下:
export MONGODB_DATABASE_URL=mongodb://USERNAME:PASSWORD@DBHOST:DBPORT/DBNAME

连接的代码如下:

var DATABASE_URL = process.env.MONGODB_DATABASE_URL || mongodb.DEFAULT_URL;

mongo_connect(DATABASE_URL, mongodb_server_options, 
      function(err, db) { 

          if(db && !err) {
          console.log("connected to mongodb" + " " + lobby_db);
          }
          else if(err) {
          console.log("NOT connected to mongodb " + err + " " + lobby_db);
          }
      });    

2
如果用户在DBNAME之外的另一个数据库中(如管理员),则必须将选项“?authSource=admin”添加到URL中。 - Getz

7

我的版本:

var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://user:pass@dhost:port/baseName', function(err, db) {
    if (err) {
        console.error(err);
    }
    var collection = db.collection('collectionName');
    collection.find().toArray(function(err, docs) {
        console.log(docs);
    });
});

4
我推荐我刚刚创建的mongoskin
var mongo = require('mongoskin');
var db = mongo.db('admin:pass@localhost/mydb?auto_reconnnect');
db.collection('mycollection').find().toArray(function(err, items){
   // do something with items
});

mongoskin是同步的吗?不,它是异步的。

4

现在有一种新的身份验证方式,可以从“admin”身份切换到所需的数据库以进行进一步操作:

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

var user = 'user';
var password = 'password';

MongoClient.connect('mongodb://'+user+':'+password+'@localhost:27017/opsdb',{native_parser:true, authSource:'admin'}, function(err,db){
    if(err){
        console.log("Auth Failed");
        return;
    }
    console.log("Connected");
    db.collection("cols").find({loc:{ $eq: null } }, function(err, docs) {
        docs.each(function(err, doc) {
          if(doc) {
            console.log(doc['_id']);
          }
        });
    });

    db.close();

}); 

1
那只是数据库连接的名称。 - jolly

3
这对我有用:

这对我有用:

Db.admin().authenticate(user, password, function() {} );

无法在较新版本的驱动程序上工作。 db.authenticate()方法不再存在。 至少,在我使用的node.js 3.1驱动程序中不存在。 我在Node Inspector控制台中收到“db.authenticate不是函数”的错误。 - David Edwards

2
你可以这样做。
var db = require('mongo-lite').connect('mongodb://localhost/test')

more details ...


喜欢这个库。包含一些回调函数。比mongo-skin更适合。 - Aaron Shafovaloff

1

参考@mattdlockyer提供的链接,以下方法适用于我:

var mongo = require('mongodb');
var server = new mongo.Server(host, port, options);
db = new mongo.Db(mydb, server, {fsync:true});
db.open(function(err, db) {
    if(!err) {
        console.log("Connected to database");
        db.authenticate(user, password, function(err, res) {
            if(!err) {
                console.log("Authenticated");
            } else {
                console.log("Error in authentication.");
                console.log(err);
            }
        });
    } else {
        console.log("Error in open().");
        console.log(err);
    };
});

exports.testMongo = function(req, res){
    db.collection( mycollection, function(err, collection) {
        collection.find().toArray(function(err, items) {
            res.send(items);
        });
    });
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接