我对实例方法有什么误解?

时间:2017-06-12 18:10:59

标签: node.js mongoose mongoose-schema libsodium

所以我有这个方法的架构:

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

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

进一步测试表明this.password未定义。实际上,this方法中未定义comparePassword。我的理解是this将引用调用该方法的对象,在本例中为user[0]

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

1 个答案:

答案 0 :(得分: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;
};

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