node.js + mongodb:等待查询完成

时间:2018-06-05 04:01:22

标签: node.js mongodb

我在node.js中有一个简单的代码

async function dbQuery() {
        const MongoClient = require('mongodb').MongoClient; 
        const url = "mongodb://localhost:27017/"; 
        const db = await MongoClient.connect(url);
        const dbo = db.db("mydb");
        const result = await dbo.collection("tblData").find({}).toArray()
        return result;
    }

async function doIt() {
        try {
              const res = await dbQuery();
              console.log("Records: " + res.length);
            } catch (error) {
              console.log(error);
            }
   }
//
console.log("Starting...")
doIt()
console.log("Done!")

输出是:

Starting...
Done!
Records: 24

如何强制代码等待查询完成?输出如:

Starting...
Records: 24
Done!

3 个答案:

答案 0 :(得分:0)

你总是可以使用承诺来完成这项工作。

async function doIt() {
  return new Promise((resolve, reject) => {
    try {
          const res = await dbQuery();
          console.log("Records: " + res.length);
          resolve();
        } catch (error) {
          reject(error);
        }
  });
}

console.log("Starting...")
doIt().then(() => {
   console.log("Done!");
})
.catch(err => console.log(err))

答案 1 :(得分:0)

另一个答案是使用Promises,但我不认为这是必要的,您使用的是asyncawait,这是Promise的最新实现。

只需将doIt()函数调用移至异步调用即可。由于这是节点,并且是非阻塞的,因此这将是更正确的实现。

async function dbQuery() {
    const MongoClient = require('mongodb').MongoClient; 
    const url = "mongodb://localhost:27017/"; 
    const db = await MongoClient.connect(url);
    const dbo = db.db("mydb");
    const result = await dbo.collection("tblData").find({}).toArray()
    return result;
}

async function doIt() {
    console.log("Starting...");
    try {
        const res = await dbQuery();
        console.log("Records: " + res.length);
    } catch (error) {
        console.log(error);
    }
    console.log("Done!");
}

doIt();

答案 2 :(得分:0)

你只需要通过 await 调用你的 doIt() 函数及其工作..

something...
await doit();
something...