使用Promises和Async / Await的MongoDB的模块化实现

时间:2018-10-01 19:32:18

标签: javascript node.js mongodb promise async-await

我想向MongoDB服务器发出Ajax请求,并使用独立功能将数据与其他异步任务一起使用,以便我可以尽可能地模块化我的代码。我对异步编程不是很有经验,所以我可能在做一些基本的错误。在我的代码中,我使用了另一个函数(doubleAfter2Seconds)来返回一个promise,效果很好。来自await getMongoData(“ mydb”,url)的结果变量输出为未定义,而不是实际数据。

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://{MyServer}:27017/";

function getMongoData(dboArg, urlArg) {
  var myPromise = () => {
    return new Promise(resolve => {
      MongoClient.connect(urlArg, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db(dboArg);
        dbo.collection(myCollection).find({}).toArray(function(err, result) {
          if (err) throw err;
          console.log(result);
          db.close();
          resolve(result[0]);
        });
      })
    })
  }
}

function doubleAfter2Seconds(x) {
  return new Promise(resolve => {
    console.log("v");
    setTimeout(() => {
      resolve(x * 2);
    }, 1000);
  });
}

async function addAsync(x) {
  // This works
  const a = await doubleAfter2Seconds(10);
  console.log(a);

  // This doesn't work
  result = await getMongoData("mydb", url);
  console.log(result);
  return x;

}

addAsync(10).then((sum) => {
  console.log(sum);
});

1 个答案:

答案 0 :(得分:0)

这是基于注释的更正后的getMongoData函数

function getMongoData(dboArg, urlArg) {
  return new Promise(resolve => {
    MongoClient.connect(urlArg, { useNewUrlParser: true }, function(err, db) {
      if (err) throw err;
      var dbo = db.db(dboArg);
      dbo.collection(myCollection).find({}).toArray(function(err, data) {
        err 
            ? reject(err) 
            : resolve(data[0]);
      });
    })
  })  
}