我目前正在尝试学习Java中的MongoDB和异步函数,并且在过去的几个小时里一直走运不顺利。

async function getObj(name) {
  var db = await mongo.connect(DBURL, {
    useNewUrlParser: true
  });

  var dbo = db.db("testdb");

  var meme;

  await dbo.collection("files").findOne({
    "_id": name
  }, function(err, res) {
    console.log(res + " a");
    meme = res;
    console.log(meme + " b");
  });

  console.log(meme + " c");
  await db.close();
  console.log(meme + " d");
  return meme;
}




程序按以下顺序打印:
C
d
一种
b

如果在console.log(res)中执行查询,则可以得到正确结果的对象,因此这不是问题。

为什么程序会忽略之前的等待并最终打印并返回undefined?

最佳答案

当您将await与回调一起使用时,您没有使用可以db.findOne的承诺。您应该像这样等待它:



async function getObj(name) {
  var db = await mongo.connect(DBURL, {
    useNewUrlParser: true
  });

  var dbo = db.db("testdb");

  var meme = await dbo.collection("files").findOne({
    "_id": name
  });

  console.log(meme + " c");
  await db.close();
  console.log(meme + " d");
  return meme;
}

09-11 20:44