繁体   English   中英

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

[英]How to check if email exist before save the user

我正在启动nodeJS / MongoDB,并且试图创建一个简单的auth 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) {当我检查错误数组时,查询始终处于待处理状态。 因此,用户可以与现有电子邮件一起保存。

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

谢谢

解决方案一:当用户使用onchange在文本字段中键入电子邮件或离开电子邮件字段时,请使用checkEmailExist。

解决方案二:使用ES6 ASYNC / AWAIT保持流,直到从checkEmailExist方法返回true或false。

删除。然后查询...如果您正在使用等待,那么为什么需要...

const checkEmailExist = async (value) => {
    const { error, exist } = await User.findOne({'email': value}).exec()
    return { error, exist };
}


看起来您正在将.then与等待混合。 我承认这里不是异步/等待方面的专家,尤其是当与promises混合使用时,但您的checkEmailExist函数可能如下所示:

const checkEmailExist = async (value) => {
    const user = await User.findOne({'email': value}).exec()
        .catch(err => console.log(err))

    let res = {};
    if (user) {
        res = { error: { 'email': "Cet adresse email n'est pas disponible" }, exist: true };
    } else {
        res = { error: { 'email': "" }, exist: false };
    }
    return res;
}

不确定是否会有所不同,但将await和then混合使用可能会给您带来意想不到的结果

问题在Object.keys(allFields).forEach(async field内部的代码是async函数,因此它处于中间执行状态,下一行代码不等待其结束,您应该使signUp asyncexport async function signUp并用常规循环替换forEach

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM