0

所以我有一个使用这种方法的模式:

UserSchema.methods.comparePassword = (candidatePassword) => {
    let candidateBuf = Buffer.from(candidatePassword, 'ascii');
    if (sodium.crypto_pwhash_str_verify(this.password, candidateBuf)) {
        return true;
    };
    return false;
};

它是这样称呼的:

User.find({ username: req.body.username }, function(err, user) {
    isValid = user[0].comparePassword(req.body.password);
    // more stuff
}

这导致Error: argument hash must be a buffer

我能够验证 user[0] 是一个有效的用户,显然是因为它成功地调用了该comparePassword方法,并且是 libsodium 函数失败了。

进一步的测试表明这this.password是未定义的。其实是在方法this中未定义。comparePassword我的理解是,它this指的是调用方法的对象,在这种情况下,user[0].

那么引用调用它自己的实例方法的对象的正确方法是什么?

4

1 回答 1

1

this并不总是像你认为的那样在箭头函数中工作。

胖箭头函数执行词法作用域(本质上是查看周围的代码并this根据上下文进行定义。)

如果您改回常规回调函数表示法,您可能会得到您想要的结果:

UserSchema.methods.comparePassword = function(candidatePassword) {
  let candidateBuf = Buffer.from(candidatePassword, 'ascii');
  if (sodium.crypto_pwhash_str_verify(this.password, candidateBuf)) {
    return true;
  };
  return false;
};

绑定示例 thishttps ://derickbailey.com/2015/09/28/do-es6-arrow-functions-really-solve-this-in-javascript/

于 2017-06-12T18:50:49.670 回答