我正在尝试在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;
}
答案 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."})
}
}
});