Javascript bcrypt.compare承诺始终返回false

Javascript bcrypt.compare承诺始终返回false,javascript,node.js,express,jwt,bcrypt,Javascript,Node.js,Express,Jwt,Bcrypt,我在GitHub上查看了bcrypt.compare的其他问题,但没有一个解决方案对我有效。它总是在bcrypt.compare()中的console.log(“failed 3”)上失败 我尝试过切换.then(),而不是像另一篇文章建议的那样使用bcrypt.compare回调,但没有任何帮助。任何帮助都将不胜感激 以下是我的代码副本和正在使用的版本摘要: 节点v8.12.0 Express 4.16.0 bcrypt 3.0.3 jsonwebtoken 8.4.0 猫鼬5.4.1 B

我在GitHub上查看了bcrypt.compare的其他问题,但没有一个解决方案对我有效。它总是在bcrypt.compare()中的console.log(“failed 3”)上失败

我尝试过切换.then(),而不是像另一篇文章建议的那样使用bcrypt.compare回调,但没有任何帮助。任何帮助都将不胜感激

以下是我的代码副本和正在使用的版本摘要:

  • 节点v8.12.0
  • Express 4.16.0
  • bcrypt 3.0.3
  • jsonwebtoken 8.4.0
  • 猫鼬5.4.1
Bcrypt散列(密码散列)

Bcrypt比较(验证用户)

router.post('/login',(req,res,next)=>{
UserData.find({email:req.body.email})
.exec()
。然后(用户=>{
if(user.length<1){
console.log(“失败1”)
返回res.status(401).json({
消息:“身份验证失败”
});
}
console.log('user[0].password',user[0].password)
console.log('user[0].password',user[0].password)
控制台日志('req.body.password',req.body.password)
比较(req.body.password,用户[0].password)。然后(函数(err,result){
如果(错误){
console.log(“失败1”)
返回res.status(401).json({
消息:“身份验证失败”
});
}
如果(结果){
const token=jwt.sign(
{
电子邮件:用户[0]。电子邮件,
用户ID:用户[0]。用户ID
},
process.env.JWT_键,
{
expiresIn:“1h”//他建议一小时
}
);
console.log(“失败的2”)
返回res.status(200).json({
消息:“身份验证成功”,
令牌:令牌
})
}否则{
console.log(“失败3”)
res.status(401).json({
消息:“身份验证失败”
})
}
})
})
.catch(错误=>{
log('err in login',err);
res.status(500).json({
错误:呃,
消息:“登录时出错”
})
})
});

通常,密码以哈希形式保存在数据库中。另外,提供足够的长度将哈希保存到数据库中(至少60个varchar)。为此,

schema.pre("save", function (next) {
    bcrypt.hash(this.password, 10, (err, hash) => {
        this.password = hash;
        next();
    });
});
然后,将普通密码与来自数据库的哈希进行比较

bcrypt.hash('mypassword', 10, function(err, hash) {
    if (err) { throw (err); }
    bcrypt.compare('mypassword', hash, function(err, result) {
        if (err) { throw (err); }
        console.log(result);
    });
});

通常,密码保存为数据库中的哈希。另外,提供足够的长度将哈希保存到数据库中(至少60个varchar)。为此,

schema.pre("save", function (next) {
    bcrypt.hash(this.password, 10, (err, hash) => {
        this.password = hash;
        next();
    });
});
然后,将普通密码与来自数据库的哈希进行比较

bcrypt.hash('mypassword', 10, function(err, hash) {
    if (err) { throw (err); }
    bcrypt.compare('mypassword', hash, function(err, result) {
        if (err) { throw (err); }
        console.log(result);
    });
});

看起来您没有在中返回您的res.status
else{console.log(“失败3”)

块,就像您在失败的2块和失败的1块中所做的那样。

看起来您没有在
else{console.log(“失败3”)

块,就像在失败的2和失败的1块中一样。

结果将始终是未定义的,因为承诺返回单个值,错误只是在捕获短语中抛出。因此,基本上,在代码中,err将包含实际结果。
您的代码应该如下所示:

bcrypt.compare(req.body.password,user[0].password).then((result)=>{
  if(result){
    console.log("authentication successful")
    // do stuff
  } else {
    console.log("authentication failed. Password doesn't match")
    // do other stuff
  }
})
.catch((err)=>console.error(err))

result
将始终是未定义的,因为承诺返回单个值,错误只会在catch短语中抛出。因此,基本上,在代码中,err将包含实际结果。
您的代码应该如下所示:

bcrypt.compare(req.body.password,user[0].password).then((result)=>{
  if(result){
    console.log("authentication successful")
    // do stuff
  } else {
    console.log("authentication failed. Password doesn't match")
    // do other stuff
  }
})
.catch((err)=>console.error(err))

好眼力,但我仍然遇到同样的错误:(好眼力,但我仍然遇到同样的错误:(Great catch@omarwaleed,更新代码b/c这更干净,但我仍然有同样的问题。还有其他想法吗?
bcrypt.compare(req.body.password,user[0].password)。然后((结果)=>{if(结果){console.log(“失败2”)return res.status(200).json({message:'Authentication Successful',})else{console.log(“failed 3”)return res.status(401).json({message:'Authentication failed'}}})catch((err)=>{console.log('err in login',err err);res status(500).json({error:err err,message:'error loggin in'})  })谢谢你,请写下你用来创建哈希的代码。我开始考虑密码本身的散列可能包含一些错误。请把它添加到问题中,这样代码的格式不是洛斯蒂也在想。我只是添加了用于散列的代码。我是新节点,我也有EXP。ress验证程序和会话正在运行。我觉得这可能也是一个问题?您正在对电子邮件进行哈希处理,而不是密码无需担心:)另外,如果问题得到解决,请接受最有助于您解决问题的答案:)Great catch@omarwaleed,更新代码b/c这更干净,但我仍然有相同的问题。还有其他想法吗?
bcrypt.compare(req.body.password,user[0].password)。然后((结果)=>{if(结果){console.log(“失败2”)返回res.status(200).json({message:'Authentication Successful',})else{console.log(“failed 3”)返回res.status(401).json({message:'Authentication failed'}}}}).catch((err)=>{console.log('err in login',err res status(500).json({error:err err,message:'error loggin'})
谢谢你,伙计。好的,那么你能写下你用来创建散列的代码吗。我开始考虑密码本身的散列可能包含一些错误。请将它添加到问题中,这样代码的格式就不会丢失。我也这么想。我刚刚添加了用于散列的代码。我是node的新手,我还运行了expressvalidator和会话。我有一种感觉,这可能也是一个问题?您正在对电子邮件进行哈希处理,而不是密码无需担心:)此外,如果问题得到解决,请接受最有助于您解决问题的答案:)