【问题标题】:Modular Implementation of MongoDB using Promises and Async/Await使用 Promises 和 Async/Await 模块化实现 MongoDB
【发布时间】:2019-03-06 22:50:52
【问题描述】:

我想向我的 MongoDB 服务器发出 Ajax 请求,并使用独立函数将数据与其他异步任务一起使用,这样我就可以尽可能地模块化我的代码。我对异步编程不是很有经验,所以我可能会犯一些基本错误。在我的代码中,我使用了另一个函数(doubleAfter2Seconds)返回一个承诺,它工作正常。 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);
});

【问题讨论】:

  • 也许我错了,但你没有从你的 getMongoData 函数返回任何东西。
  • var myPromise = () => { 行应该做什么?
  • 永远不要在异步回调中使用if (err) throw err;!您应该改为reject 承诺。并且可能不会忘记关闭连接。
  • getMongoData() 返回如下: return new Promise(resolve => { ...
  • 您将所有内容存储在 var myPromise = () => {.... 中,但从不返回函数之外的任何内容。

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


【解决方案1】:

这是基于 cmets 的更正 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]);
      });
    })
  })  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2019-01-08
    相关资源
    最近更新 更多