每次我想使用DB时都需要打开MongoDB连接吗?

时间:2016-08-01 08:04:47

标签: node.js mongodb

在我正在使用的示例中是这段代码:

//lets require/import the mongodb native drivers.
var mongodb = require('mongodb');

//We need to work with "MongoClient" interface in order to connect to a mongodb server.
var MongoClient = mongodb.MongoClient;

// Connection URL. This is where your mongodb server is running.
var url = 'mongodb://localhost:27017/my_database_name';

// Use connect method to connect to the Server
MongoClient.connect(url, function (err, db) {
  if (err) {
    console.log('Unable to connect to the mongoDB server. Error:', err);
  } else {
    //HURRAY!! We are connected. :)
    console.log('Connection established to', url);

    // Get the documents collection
    var collection = db.collection('users');

    //Create some users
    var user1 = {name: 'modulus admin', age: 42, roles: ['admin', 'moderator', 'user']};
    var user2 = {name: 'modulus user', age: 22, roles: ['user']};
    var user3 = {name: 'modulus super admin', age: 92, roles: ['super-admin', 'admin', 'moderator', 'user']};

    // Insert some users
    collection.insert([user1, user2, user3], function (err, result) {
      if (err) {
        console.log(err);
      } else {
        console.log('Inserted %d documents into the "users" collection. The documents inserted with "_id" are:', result.length, result);
      }
      //Close connection
      db.close();
    });
  }
});

正如您所看到的,他正在connect函数中进行操作。我想保持模块化并将连接与数据库操作分开。

我的建议是在db变量上创建一个单例并重用该变量。至少这就是我在Java习惯做的事情。

但是,我不确定在例子中他没有提出类似的建议。

3 个答案:

答案 0 :(得分:4)

如果您想要任何类型的可伸缩性,我建议不要维护一个连接。

连接池等有很多选项,但是大多数人花费任何时间使用Node和MongoDB最终会在某些时候转移到Mongoose。

除了添加一个漂亮的模式层,它还提供连接抽象,以便您可以通过调用mongoose.connect()来默认为共享连接,或者您可以通过调用{{1}创建多个连接或参与连接池。 }。在这两种情况下,你都可以在没有回调的情况下调用它,并且mongoose机器将推迟对模块的后续调用,直到建立连接为止,这样你的代码就不必关心了。

您的用例之类的内容可能如此:

mongoose.createConnection()

然后在./models/user.js

// in your app.js or server.js file
var mongoose = require('mongoose');
mongoose.connect(config.db.url); // assuming you have some module that handles config variables

最后,让我们说一个种子函数来创建你的初始一批用户:

const mongoose = require('mongoose'),
         Schema   = mongoose.Schema;

   const UserSchema = new Schema({
      name: String,
      age: Number,
      roles: [String]
   });
   mongoose.model('User',UserSchema);

答案 1 :(得分:1)

在服务器启动时说启动mongo连接。

Server.js:

...
        var db = require('./db');//require db.js
        db.openMongoConnection(function(error)
        {
            if(error)
            {
                console.log(error);
                console.log("cannot make the connection with database");
            }
            else
            {
               server.listen(7400);//say ur server listening on 7000 port
            }
        }

db.js

    var db1;
    var MongoClient = require('mongodb').MongoClient;
     exports.openMongoConnection = function(callback)
     {
            MongoClient.connect(<YourUrl1>,function(err,dbInstance)
            {
                if(err)
                {
                    callback(err);
                }
                else
                {
                    db1 = dbInstance;
                    callback(null);
                }
            });
     };


exports.getCollection = function(collectionName, callback){
  dbInstance.collection(collectionName, function(err, collectionInstance){
    if(err)
    {
       callback(err);
    }
    else
    {
       callback(null, collectionInstance)
    }
  });
}

然后,您可以通过要求dbInsance

随时调用getCollection

答案 2 :(得分:0)

我相信保持单一连接是最好的,如another thread中所述:

node-mongodb-native says中的主要提交者

  

在应用程序启动并重新使用db对象时,打开一次do MongoClient.connect。每个.connect都不是一个单例连接池。因此,请一次打开它,然后在所有请求中重复使用。