3

新しい接続を開くか、再利用することをお勧めしますか?モジュールを使用する場合、コードをいくつかのファイルに分割するために使用されているためです。

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")

非同期の場合、同じ接続(ソケット)を引き続き使用するように注意する必要があります。これにより、書き込みが完了するまで次の操作が開始されません。

ありがとう !

4

1 に答える 1

6

require('somemodule')もう一度必要になると、すでにロードされているインスタンスが使用されます。これにより、シングルトンを非常に簡単に作成できます。

だから-中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に、最初に接続し、2回目にはすでに接続されているものを返すというものです。このようにして、同じ接続(ソケット)を使用していることを確認します。

于 2012-08-16T19:11:58.167 に答える