首页 > 解决方案 > Bcrypt.compare() 仅返回 false,在 Promise 下使用

问题描述

我正在使用 Bcrypt 对密码进行哈希处理并将其存储在数据库中,

当我从数据库中检索散列密码并与键入的用户密码进行比较时,Bcrypt 返回 false。

我在 Promise 下使用它,但 bcrypt 在正确的密码上返回 false

这是代码:

userSchema.statics.findByCredentials = function(email, password) {
const User = this;

return User.findOne({email}).then((user) => {
    if(!user) {
        return Promise.reject();
    }
    // console.log(user.password);

    return new Promise((resolve, reject) => {
        bcrypt.compare(password, user.password, (err,res) => {
             if(res) {
                 resolve(user);
             }
             else {
                 reject("Problem here");
             }
            console.log(res);

        });            
    });
});

};

我正在尝试将承诺链连接到主文件,即 server.js 并将详细信息返回给用户,但它不起作用。

这里是快递的路线代码:

app.post('/users/login', (req, res) => {
const body = _.pick(req.body, ['email', 'password']);
// res.send(body);

User.findByCredentials(body.email, body.password)
    .then((user) => {
        res.send(user);
    }).catch((e) => res.send(e));

});

谢谢

标签: node.jsexpressbcrypt

解决方案


您是否尝试过使用promise apibcrypt

它可能看起来像这样:

userSchema.statics.findByCredentials = function(email, password) {
  const User = this;

  return User.findOne({email}).then((user) => {
      if(!user) {
          return Promise.reject();
      }
      // console.log(user.password);

      return bcrypt.compare(password, user.password)
        .then(res => {
          if (res) {
            return user;
          }
          throw new Error('Problem here');
        });
  });
}

如果没有,您可能会遇到错误,因此您可以检查err参数以查看是否有东西从那里返回。除此之外,只要user.password是原始密码的散列版本,它就应该可以工作。


推荐阅读