Node.js NodeJS中的用户验证过程

Node.js NodeJS中的用户验证过程,node.js,express,Node.js,Express,我试图在insert方法上获得此用户验证过程,下面是函数中似乎不起作用的部分: exports.insert = (req, res) => { let validEmail = false; userModel.findByEmail(req.body.email) .then((result)=>{ if(result) { console.log("ok"+result)

我试图在insert方法上获得此用户验证过程,下面是函数中似乎不起作用的部分:

exports.insert = (req, res) => {

    let validEmail = false;


    userModel.findByEmail(req.body.email)
        .then((result)=>{
            if(result) {
                console.log("ok"+result)
            }
            else{
                console.log("nok"+result);
                validEmail = true;
                //returns true when a not used email is posted
            }
        });

    let validPassword = validatePassword(req.body.password);
    console.log(validEmail, validPassword); //always returns false for validEmail

    //If statement to verify if both validEmail and validPassword are "true"
密码验证工作正常(到目前为止相当简单),但一直不起作用的是电子邮件验证。 由于我使用电子邮件作为身份验证的标识符,我需要它是唯一的,因此我使用findByEmail,如下所示:

    exports.findByEmail = (email) => {
    return  User.findOne({"email":email})
        .then((result) => {
            if(result) {
                result = result.toJSON();
                delete result.__v;
                delete result.password;
                return result;
            }else{
                return null;
            }
        })
    };
它确实管用,但看起来像

validEmail = true 
在if语句之后发生。当我将console.log if添加到else语句时,它确实会影响validEmail的true,但随后它不会进入if语句

有什么不对劲吗

编辑:下面是validatePassword函数:

function validatePassword(password){
    return password.length>6;
}

问题似乎是您剥离了promise,因此它异步运行并继续验证密码。在您的情况下,当电子邮件未找到时,此(密码验证)应位于承诺的
then
块中。

好的,谢谢@PeS,我得到了答案

基本上,我没有等待异步函数findByEmail的答案。 我所做的是连锁。然后按如下方式阻止,但不确定这是否是最好的方式:

    let validEmail = false;
    let validPassword = req.body.password.length>6;

    userModel.findByEmail(req.body.email)
        .then((result)=>{
            if(!result){
                validEmail = true;
                console.log("1"+validEmail)//returns true
            }
        }).then(() => {
        if(validEmail && validPassword){
            let salt = crypto.randomBytes(16).toString('base64');
            let hash = crypto.createHmac("sha512", salt).update(req.body.password).digest("base64");
            req.body.password = salt + "$" + hash;
            req.body.permissionLevel = 1;
            userModel.createUser(req.body)
                .then((result) => {
                    res.status(201).send({id: result._id});
                })
        }else {
            if (!validEmail && validPassword) {
                res.status(409).send({"Error": "Email already used."});
            }  else if(!validPassword && validEmail){
                res.status(409).send({"Error":"Password is not valid"})
            }else{
                res.status(409).send({"email": "Email already used.", "password": "Password is not valid."})
            }
        }
    });

实际上,我在ValidMail的开头将validPassword设置在外部,以便我知道是否只有电子邮件或密码不匹配。我添加了validateEmail功能,但正如我所说的,密码验证工作得很好;但这是问题的根源吗?此外,我还添加了2个console.logs,每个日志的结果都是well、check-on-promissions和async代码,这是您的问题所在。当代码到达if语句时,变量还没有设置。把断点放在if行和validEmail=true行上,看看会发生什么。坦率地说,这不是解决问题的方法。你根据我的答案写了你的答案——甚至给了我信用——并接受了。不公平。我实际上改变了我做这件事的方式。是的,我给了你学分并感谢你,这还不够吗?但这里是要点,很抱歉点击了错误的答案。。。