方法未定义?无法使用收益率

时间:2016-06-19 15:30:56

标签: node.js mongoose bcrypt

我想要产生一个过程。但是,我得到错误:您可能只生成函数,promise,生成器,数组或对象,但传递了以下对象:" undefined"。

不确定原因。

Mongoose方法:

UserSchema.methods.comparePassword = function(candidatePassword, cb) {
 bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
    if (err){
       return cb(err);
     }
    cb(null, isMatch);
 });
};

用法:

yield user.comparePassword(this.request.body.password, function(err, isMatch) {
    console.log(isMatch);
});

使用时发生错误。 user不为null或未定义。

1 个答案:

答案 0 :(得分:3)

问题在于comparePassword没有返回任何内容,这就是为什么你会收到有关undefined的错误的原因。

我们假设你希望comparePassword返回一个承诺。这意味着您需要使用promise来包装bcrypt.compare() - 它使用回调 - 并返回该承诺:

UserSchema.methods.comparePassword = function(candidatePassword) {
  var user = this;
  return new Promise(function(resolve, reject) {
    bcrypt.compare(candidatePassword, user.password, function(err, isMatch) {
      if (err) return reject(err);
      resolve(isMatch);
    });
  });
};

这就是您使用它的方式:

yield user.comparePassword(this.request.body.password); // no callback