#javascript #node.js #express #promise #async-await
#javascript #node.js #выразить #обещание #асинхронный -ожидание
Вопрос:
Я пытаюсь получить возвращаемое значение из функции ниже, но не могу, потому что возвращаемое значение выполняется до того, как возвращается результат.
Может ли кто-нибудь указать мне правильное направление?
exports.addUser = async (data) => {
const updateduser = await db.User.findOne({
where: {
email: data.email,
},
}).then(user => {
if (user) {
return null
} else {
bcrypt.hash(data.password, 10).then(
hashedPassword => {
const newUser = {
firstName: data.firstName,
lastName: data.lastName,
email: data.email,
password: hashedPassword
}
db.User.create(newUser).then(insertedUser => {
return insertedUser
})
}
)
}
});
return updateduser
}
Контроллер, где ответ должен основываться на возвращаемом значении из функций addUser выше..
exports.signUp = async (req, res, next) => {
const userData = {
firstName: req.body.firstName,
lastName: req.body.lastName,
email: req.body.email,
password: req.body.password,
};
const {
error
} = signUpValidation(userData);
if (error) return res.status(400).json({
message: error.details[0].message
});
try {
const user = await addUser(userData);
if (!user) {
res
.status(403)
.json({
message: "This email is already exits, Please login 🔁 "
});
} else {
res.status(200).json({
id: user.id,
email: user.email,
status: true,
message: " You're now registered!✅Please check your Email!✅ ",
});
}
} catch (error) {
next(error);
}
}
Комментарии:
1. С какой функцией у вас возникли проблемы
addUser
илиsignUp
?2. Попробуйте последовательно использовать
await
вместо того, чтобы смешивать его с.then()
.3. оберните новое обещание, разрешите значение вместо возврата
4. Вы должны вернуть
bcrypt
обещание так же, какdb.User.create
и обещание5. я думаю
insertedUser
, что никогда не возвращался… это обратный вызов внутри обратного вызова .. попробуйте поставитьreturn
перед каждым обещанием, которое вы выполняете().then
..
Ответ №1:
Затем вы смешиваете асинхронные / await и вложенные вызовы then до такой степени, что становится действительно сложно следовать вашему коду. Вы всегда должны стараться придерживаться либо async / await, либо then (хотя есть несколько исключений). Также старайтесь избегать вложенности, когда это возможно. Ваш код можно упростить до следующего:
exports.addUser = async (data) => {
const user = await db.User.findOne({
where: {
email: data.email,
},
});
if (user) {
return null;
}
const hashedPassword = await bcrypt.hash(data.password, 10);
const newUser = {
firstName: data.firstName,
lastName: data.lastName,
email: data.email,
password: hashedPassword,
};
return db.User.create(newUser);
};
Вероятно, вам следует прочитать немного больше о await.
Обратите внимание, что основная проблема в вашем коде заключается в том, что вы возвращаете что-то во вложенном обратном вызове then. Но вы не возвращаете ни внутреннее, ни внешнее, а затем блокируете себя.
Комментарии:
1. Отметил, что я немного смущен, я знаю, что значения доступны в блоке кода, мне трудно перемещать значения между блоками по порядку