NodeJS - MongoDB:使用开放连接

时间:2012-08-16 16:21:22

标签: node.js mongodb

最好是打开新连接还是重复使用?使用模块时,因为我习惯将我的代码分成几个文件。

a.js

module.exports = function (req, res) {

  new mongodb.... (err, db) { // open a connection
    b(function (err, result) {
      db.close(); // close the connection
      res.send(result);
    });
  });

};

b.js

// re-open a connection ? or take the connection of "a.js" ? (passing "db")
  

异步时,必须小心继续使用相同的连接(套接字)。这可确保在写入完成之后,下一个操作不会开始。

谢谢!

1 个答案:

答案 0 :(得分:5)

当您require('somemodule')然后再次需要它时,它将使用ALREADY加载的实例。这可以让你轻松创建单身。

所以 - 在sharedmongo.js内部:

var mongo = require('mongodb');

// this variable will be used to hold the singleton connection
var mongoCollection = null;

var getMongoConnection = function(readyCallback) {

  if (mongoCollection) {
    readyCallback(null, mongoCollection);
    return;
  }

  // get the connection
  var server = new mongo.Server('127.0.0.1', 27017, {
    auto_reconnect: true
  });

  // get a handle on the database
  var db = new mongo.Db('squares', server);
  db.open(function(error, databaseConnection) {
    databaseConnection.createCollection('testCollection', function(error, collection) {

      if (!error) {
        mongoCollection = collection;
      }

      // now we have a connection
      if (readyCallback) readyCallback(error, mongoCollection);
    });
  });
};
module.exports = getMongoConnection;

然后在a.js内:

var getMongoConnection = require('./sharedmongo.js');
var b = require('./b.js');
module.exports = function (req, res) {
  getMongoConnection(function(error, connection){
    // you can use the Mongo connection inside of a here
    // pass control to b - you don't need to pass the mongo
    b(req, res);
  })
}

b.js内:

var getMongoConnection = require('./sharedmongo.js');
module.exports = function (req, res) {
  getMongoConnection(function(error, connection){
    // do something else here
  })
}

这个想法是a.jsb.js同时调用getMongoCollection,第一次连接,第二次返回已经连接的那个。这样它可以确保您使用相同的连接(套接字)。