首页 > 解决方案 > 如何在保存用户之前检查电子邮件是否存在

问题描述

我正在启动 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是我签入数据库的函数

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) {。因此,可以使用现有电子邮件保存用户。

如何在保存用户之前正确检查电子邮件是否存在?

谢谢

标签: javascriptnode.jsexpressasync-await

解决方案


问题在Object.keys(allFields).forEach(async field。foreach 里面的代码是async函数,所以它中间执行,下一行代码不等它结束。您应该进行 signUp async:export async function signUp并替换forEach为常规循环:

for (const field in allFields) {
   ...
}

推荐阅读