Node.js MongoDb find函数忽略等待

Node.js MongoDb find函数忽略等待,node.js,promise,mongodb-.net-driver,Node.js,Promise,Mongodb .net Driver,我需要在异步函数的return语句之前触发Node.js mongodb 3.1.6中的find回调函数,但是在回调函数之前调用return语句,即使前面有等待 async function(myId) { const myObject = MyObject() await collection.find({where: {id: myId}}, async (err, results) => { if (err) { logger.error(

我需要在异步函数的return语句之前触发
Node.js mongodb 3.1.6
中的
find
回调函数,但是在回调函数之前调用return语句,即使前面有等待

async function(myId) {
  const myObject = MyObject()
  await collection.find({where: {id: myId}}, async (err, results) => {
        if (err) {
          logger.error('error');
        }
        myObject.add(results);
      });
  return myObject
}

我看到过一些例子,其中使用了模式
find(query.toArray()
,而不是
find(query,callback)
。但在我的情况下,这根本不适用。我们将
Node.js mongodb 3.1.6
环回连接器mongodb
一起使用,这可能与问题有关

如果mongo不提供承诺回复功能,那么您可以自己承诺。创建包装器的承诺和它使用的匿名回调都不应声明为异步,但调用方应

function findById(collection, myId) {
  return new Promise((resolve, reject) => {
    collection.find({where: {id: myId}}, (err, results) => {
      (err)? reject(err): resolve(results);
    });
  });
}

// now callers can use the async await pattern...
async someFunction() {
  try {
    let myId = // ...
    let collection = // ...
    let results = await findById(collection, myId);
    // do something with results
  } catch (err) {
    // error
  }
}

关键的想法是,带有回调的collection.find不符合等待的条件,因为它不返回承诺。传递给它的匿名回调函数不是异步函数。。。只要find回叫它,它就会立即开始工作。因此,我们围绕mongo构建了一个承诺,然后使用新的async/await语法来实现该承诺。

hmm,的3.1文档甚至没有说它允许回调,并且总是返回游标并返回承诺,这是
wait
关键字使用异步方法正确工作的一个要求。我必须承认这是非常有意义的。我无法理解我使用的find是否有所不同,因为我导入了
环回连接器mongodb
(这是一个大项目,我不负责选择库,导入很混乱),但是
toArray()
不起作用,我给find的回调在很久以后被调用,我不知道这是否是因为它将其视为选项,而我不知道它是如何使用的。这是可行的,但我仍然不明白为什么我的代码会以这种方式运行。在@kmdreko和其他人的评论之后,我认为我与导入有冲突,这就是原因。关键思想是带有回调的collection.find没有资格等待,因为它没有返回承诺。传递给它的匿名回调函数不是异步函数。。。只要find回叫它,它就会立即开始工作。因此,我的建议是围绕mongo构建一个承诺,然后在该承诺中使用新的async/await语法。你能把这个加到你的答案里吗?我知道我已经标记了它,但这也解释了为什么我的代码不起作用。