异步等待mongoDb始终返回未定义

时间:2020-10-08 13:52:34

标签: node.js mongodb express

这是我的异步功能

   async duplicate_email(db, email) {
        await db.collection("users").findOne({ 'email': email }, function(findErr, result) {
            console.log(findErr)
            if (!result) {
                return false
            } else {
                return true
            }
        });
    }

我从另一个文件中这样称呼它:

 middleware.duplicate_email(db, "admin@admin.com").then((answer) => {
        console.log(answer)
    });

答案总是返回未定义的,而结果是填充的。

3 个答案:

答案 0 :(得分:0)

您应该通过将mongo调用设置为变量来利用async / await promise语法。像这样:

async duplicate_email(db, email) {

   let myResults;
   try {
     myResults = await db.collection("users").findOne({ 'email': email });
   } catch (err) {
      console.log(err);
   }
   return myResults ? true : false;
 }

然后您可以使用duplicate_email返回的承诺

middleware.duplicate_email(db, "admin@admin.com").then((answer) => {
    console.log(answer)
});

那是使用异步/等待的美丽。您不再需要回调。但是,要捕获错误,您将需要try catch块。

答案 1 :(得分:0)

async duplicate_email(db, email) {
   let availableEmail =  await db.collection("users").findOne({ 'email': email }) 
       
        if (!availableEmail) {
            return false
        } else {
            return true
        }
    });
}

如果您使用的是异步功能,请不要使用回调。

答案 2 :(得分:0)

这是一个简短的解决方案

只需返回结果并将其反转两次即可。您将得到truefalse

async duplicate_email(db, email) {
    try {
       return !!(await db.collection("users").findOne({ 'email': email }))
    }catch(err) {
       console.log(err)
    }
}