Node.js NodeJS中的用户验证过程
我试图在insert方法上获得此用户验证过程,下面是函数中似乎不起作用的部分: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)
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行上,看看会发生什么。坦率地说,这不是解决问题的方法。你根据我的答案写了你的答案——甚至给了我信用——并接受了。不公平。我实际上改变了我做这件事的方式。是的,我给了你学分并感谢你,这还不够吗?但这里是要点,很抱歉点击了错误的答案。。。