#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. Большое спасибо, я действительно ценю это, теперь это работает!