Async Await MongoDB всегда возвращает неопределенное значение

#node.js #mongodb #express

#node.js #mongodb #выразить

Вопрос:

это моя асинхронная функция

    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)
    });
  

ответ всегда возвращает undefined, в то время как результат заполняется.

Ответ №1:

Вы должны использовать синтаксис обещания async / await, установив вызов mongo равным переменной. Что-то вроде этого:

 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)
});
  

В этом прелесть использования async / await. Вам больше не нужны обратные вызовы. Однако для отслеживания ошибок вам понадобится try catch блок.

Комментарии:

1. Большое спасибо, SilencedoGood, здорово иметь возможность рассчитывать на вас в решении подобных проблем!

Ответ №2:

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

если вы используете асинхронную функцию, не используйте обратный вызов.

Комментарии:

1. Большое спасибо за ваш любезный ответ, я так рад, что могу рассчитывать на вашу помощь!

Ответ №3:

Вот короткое решение

Просто верните результат и инвертируйте его дважды. Вы получите либо true или false

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

Комментарии:

1. Большое спасибо, я действительно ценю это, теперь это работает!