Node.js MongoDb查找功能忽略等待

时间:2018-10-01 21:37:11

标签: node.js promise mongodb-.net-driver

我需要在异步函数的return语句之前触发find的{​​{1}}的回调函数,但是即使在其中等待,也要在回调函数之前调用return语句面前。

Node.js mongodb 3.1.6

我看到了一些示例,其中使用了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, callback)。但这对我而言根本不起作用。我们将find(query).toArray()Node.js mongodb 3.1.6一起使用,也许这与问题有关。

1 个答案:

答案 0 :(得分:1)

如果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构建了一个promise,然后使用带有该promise的新async / await语法。