同步执行nodejs

时间:2017-10-01 18:11:31

标签: node.js mongodb asynchronous synchronous

我正在尝试编写一个接受mongodb集合名称作为参数的函数,并返回该集合的一个实例,以便它可用于执行CRUD操作。但是当我试图返回集合的实例时,它返回' undefined' ,因为在 MongoClient.connect 函数完成之前执行了return语句执行。

module.exports.dbConnection = function(collectionName)
{
  var MongoClient = require('mongodb').MongoClient;
  var url = "mongodb://127.0.0.1/test";
  var collName;
  MongoClient.connect(url, function(err, db) 
  {
      var collName = db.collection(collectionName); 
      console.log(collName)
  });
  return collName;
}

我能否就如何解决这个问题获得帮助。 感谢

2 个答案:

答案 0 :(得分:0)

实现此目的的正确方法是使用回调。接受回调参数,然后在操作完成时将所需信息传递给该函数。

module.exports.dbConnection = function(collectionName, cb)
{
  var MongoClient = require('mongodb').MongoClient;
  var url = "mongodb://127.0.0.1/test";
  var collName;
  MongoClient.connect(url, function(err, db) 
  {
      var collName = db.collection(collectionName); 
      cb(collName); // invoke our callback
  });
}

你这样使用它:

dbConnection('collName', function (coll) {
    console.log(coll);
    // do something else with our collection
})

答案 1 :(得分:0)

如果您使用的是至少7.10版的Node,则可以使用异步功能和承诺来完成此操作。

// You can return a promise and resolve the promise once connected
module.exports.dbConnection = function dbConnection(collectionName) {
  const MongoClient = require('mongodb').MongoClient;
  const url = "mongodb://127.0.0.1/test";

  return new Promise((resolve, reject) => {
    MongoClient.connect(url, function (err, db) {
      if (err) {
        return reject(err);
      }
      resolve(db.collection(collectionName)); 
    });
  });
}

// You can then call the function within an async function (Node v7.10 and above)
async function fnThatCallsDbConnection() {
  try {
      const collName = await dbConnection('someCollection');
  } catch(e){
    // do something with error
  }
}

您可以做的其他事情是缓存数据库连接,这样您就不需要每次都连接 - 这是您可以这样做的方式:

let cachedDB;
module.exports.dbConnection = function dbConnection(collectionName) {
  const MongoClient = require('mongodb').MongoClient;
  const url = "mongodb://127.0.0.1/test";

  return new Promise((resolve, reject) => {
    if (cachedDB) {
      resolve(cachedDB.collection(collectionName));
    } else {
      MongoClient.connect(url, function (err, db) {
        if (err) {
          return reject(err);
        }
        cachedDB = db;
        resolve(db.collection(collectionName)); 
      });
    }
  });
}