Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Bcrypt比较始终返回false_Javascript_Node.js_Mongoose_Bcrypt - Fatal编程技术网

Javascript Bcrypt比较始终返回false

Javascript Bcrypt比较始终返回false,javascript,node.js,mongoose,bcrypt,Javascript,Node.js,Mongoose,Bcrypt,bcrypt.compare()。这是使用bcrypt nodejs实现的 User.pre('save', function (callback) { this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10)) this.token = jwt.sign(this.email, process.env.JWT_SECRET) callback() }) User.methods.verifyPass

bcrypt.compare()。这是使用bcrypt nodejs实现的

User.pre('save', function (callback) {
  this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10))
  this.token = jwt.sign(this.email, process.env.JWT_SECRET)
  callback()
})

User.methods.verifyPassword = function ( password ) {
  const self = this

  return Q.Promise( (resolve, reject) => {
    bcrypt.compare( password, self.password, (error, isMatch) => {
      if (error) reject( new Error("Error checking user password."))
      resolve(isMatch)
    })
  })
}
我可以看到数据库中出现了一个散列。我可以看到正确的密码进入
verifyPassword
功能



编辑:问题似乎是
.pre('save'),…
连续出现两次。因此,新的散列密码再次被散列。

这是您的代码的工作版本。我不确定您的方法在幕后发生了什么,所以我编造了这部分

为了证明它是有效的,将它添加到一个名为index.js的文件中,并使用“node index.js”运行它

它将输出以下内容:

We got a match! true or false? true
这是密码

var bcrypt = require('bcrypt');
var Q = require('Q');
var salt = bcrypt.genSaltSync(10);


process.env.JWT_SECRET = 'Much_Secretive,_Such_Obscure';

function SuperUser () {
  this.pre = function (password, callback) {
    this.password = bcrypt.hashSync(password, salt);
    callback.call(this, password);
  };
  this.methods = {};
}

var User = new SuperUser();

User.methods.verifyPassword = function ( password ) {
  const self = this;

  return Q.Promise( (resolve, reject) => {
    bcrypt.compare( password, self.password, (error, isMatch) => {
      if (error) reject( new Error("Error checking user password."));
      console.log("We got a match! true or false? " + isMatch);
      resolve(isMatch);
    });
  });
};

User.pre('save', function (password) {
  this.methods.verifyPassword.call(this,password);
});
如果没有看到您的完整实现,很难确定,但是可能有一个对“this”的引用,而不是您期望的“this”

我使用function.call多次来解决这个问题。

解决方案是
如果(!this.isModified('password'))返回callback()
,如下所示

User.pre('save', function (callback) {
  if (!this.isModified('password')) return callback()

  this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10))
  this.token = jwt.sign(this.email, process.env.JWT_SECRET)
  callback()
})
这是因为它在保存过程中多次触发。因此它实际上是对密码进行哈希运算,然后在第二轮中,对哈希进行哈希运算