Процесс проверки пользователя в NodeJS - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь получить этот процесс проверки пользователя для метода вставки, вот часть функции, которая, кажется, не работает:

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, он влияет на true на validEmail, но впоследствии не включается в оператор if.

Что-то не так?

edit: вот функция validatePassword:

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

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Кажется, проблема в том, что вы раскручиваете обещание, поэтому оно выполняется асинхронно и продолжает проверять пароль. Это (проверка пароля) должно быть в блоке then Обещания, если электронная почта не найдена, в вашем случае.

0 голосов
/ 21 июня 2019

Хорошо, я получил ответ благодаря @ 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."})
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...