Я запускаю nodeJS / MongoDB и пытаюсь создать простой API аутентификации.Я начал с функции SignIn, но у меня возникли некоторые трудности с асинхронными функциями при проверке значений формы.Я пытаюсь проверить все значения, прежде чем сохранить строку в базе данных.Поэтому я проверяю пароль и формат электронной почты, и мои трудности начинаются, когда я хочу проверить, существует ли уже электронная почта.
Здесь вы можете увидеть, как моя функция вызывается при отправке формы:
export function signUp(req, res) {
const { email, password, confirmPassword } = req.body || '';
const allFields = { email, password, confirmPassword };
let errors = {};
Object.keys(allFields).forEach(async field => {
const value = allFields[field];
if (value === '') {
errors = {...errors, [field]: 'Ce champ est requis'}
} else {
if (field === 'email') {
if (!checkEmailFormat(value)) {
errors = {...errors, [field]: 'Le format de mail n\'est pas valide'}
} else {
const { error, exist } = await checkEmailExist(value);
if (exist) {
console.log(exist);
console.log(error);
errors = {...errors, ...error};
}
}
}
if (field === 'password' && password !== '' && password < 6) {
errors = {...errors, [field]: 'Le mot de passe doit contenir plus de 6 caractères'}
}
}
});
console.log(errors);
console.log(Object.keys(errors).length);
console.log('--------------------');
// Retour des erreurs vers le FRONT ou Save de l'user
if (Object.keys(errors).length > 0) {
console.log(errors);
res.json({ errors });
} else {
...Save my row in db
}
}
И здесь моя функция checkEmailExist
, которая регистрирует в db
const checkEmailExist = async (value) => {
const { error, exist } = await User.findOne({'email': value}).exec()
.then(user => {
let res = {};
if (user) {
res = { error: { 'email': "Cet adresse email n'est pas disponible" }, exist: true };
} else {
res = { error: { 'email': "" }, exist: false };
}
return res;
})
.catch(err => console.log(err))
return { error, exist };
}
Моя цель - получить ошибку, возвращаемую функцией checkEmailExist
, и отправить эти ошибки в FRONT с другими ошибками.Но findOne
- это асинхронная функция, и запрос всегда выполняется, когда я проверяю свой массив ошибок if (Object.keys(errors).length > 0) {
.Таким образом, пользователь может быть сохранен с существующей электронной почтой.
Как правильно проверить, существует ли электронная почта перед сохранением пользователя?
Спасибо