3

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

一个.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")

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

谢谢 !

4

1 回答 1

6

当您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.js调用b.jsgetMongoCollection,第一次它会连接,第二次它会返回已经连接的那个。这样可以确保您使用相同的连接(套接字)。

于 2012-08-16T19:11:58.167 回答