Node.js MongoDb 查找函数忽略等待

Node.js MongoDb find function ignores wait

我需要在异步函数的 return 语句之前触发 Node.js mongodb 3.1.6find 的回调函数,但是 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.6loopback-connector-mongodb 可能这与问题有关。

如果mongo没有提供承诺应答功能,那么你自己承诺这个。 promise-creating wrapper 和它使用的匿名回调都不应该被声明为异步的,但是调用者应该....

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 回调不符合等待条件,因为它没有 return 承诺。您传递给它的匿名回调函数不是异步函数……它会立即执行工作,只要 find 回调它。所以我们围绕 mongo 构建一个承诺,然后使用新的 async/await 语法来实现这个承诺。