async await js - резудьтат функции undefined через return (JS)
у меня возникла проблема вывода ассинхронных данных. Можете помочь и обьяснить, как вывести хоть какойто ответ кроме undefined из функции emailValid, поидее в переменной emailAfter и usernameAfter должен быть promise (так как возвращаеться promise через return и await ждет ответа из MongoDB), а ответ получаеться undefined, почему и есть идеи по исправлению ?
Заранее спасибо
function emailValid(){
db.collection("userData").find({
email: clientData.email
},{username: 1, email: 1})
.toArray((err, result) => {
return new Promise((resolve, reject) => {
if (result.length == 0) {
resolve("Email is valid");
} else{
reject(new Error("Email is already taken"));
}
});
});
function usernameValid(){
db.collection("userData").find({
username: clientData.username
},{username: 1, email: 1})
.toArray((err, result) => {
return new Promise((resolve, reject) => {
if (result.length == 0) {
resolve("Username is valid");
} else{
reject(new Error("Username is already taken"));
}
});
});
}
async function validationReg(){
// Email validation
try{
let emailAfter = await emailValid(); // emailAfter - undefined
let usernameAfter = await usernameValid(); // usernameAfter - undefined
if (emailAfter == usernameAfter) {
res.status(201).json({
message: "Data Valid",
emailAfter: emailAfter,
usernameAfter: usernameAfter
})
}
} catch(err) {
err = err.toString();
res.status(203).json({
message: "Error",
err: err
})
}
Ответы (1 шт):
Автор решения: Yugofx
→ Ссылка
Есть несколько вариантов, один из них вам уже написали в комментарии. Верните из usernameValid и emailValid промисы и резолвьте их в validationReg.
function emailValid() {
return new Promise((res, rej) => {
db.collection("userData")
.find(
{ email: clientData.email },
{ username: 1, email: 1 }
)
.toArray((err, result) => {
result.length == 0
&& res("Email is valid")
|| rej("Email is already taken");
})
});
}
Аналогично для второй.
Или есть вариант не создавать промисы в каждой функции, а биндить их уже в самой validationReg.
function emailValid(res, rej) {
db.collection("userData")
.find(
{ email: clientData.email },
{ username: 1, email: 1 }
)
.toArray((err, result) => {
result.length == 0
&& res("Email is valid")
|| rej("Email is already taken");
})
}
...
async function validationReg(){
try {
let emailAfter = await new Promise(emailValid);
let usernameAfter = await new Promise(usernameValid);
...
} catch(err) {
...
}
}