NodeJS中的用户验证过程

时间:2019-06-20 22:48:32

标签: node.js express

我正在尝试在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中的else语句时,它确实会影响validEmail的true,但之后不会出现在if语句中。

有什么问题吗?

edit:这是validatePassword函数:

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

2 个答案:

答案 0 :(得分:1)

问题似乎是您剥离了promise,因此它异步运行并继续验证密码。如果您未找到电子邮件,则此(密码验证)应位于Promise的then块中。

答案 1 :(得分:0)

好,所以我感谢@PeS

基本上,我不是在等待异步函数findByEmail的答案。 我所做的是链.then这样阻止,但不确定这是否是最好的方法:

    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."})
            }
        }
    });