2017-07-10 2 views
0

Mongo DBからレコードを取得した後、comparePasswordメソッドを呼び出して、ユーザーが入力したパスワードとデータベースに格納されているパスワードを比較します。 レコードを印刷すると、すべてのデータが表示され、comparePassword this.passwordは未定義となります。MongooseでBcryptを使用しているときは、comparePasswordメソッドでthis.passwordが未定義です。の解き方?

User.findOne ({ username : req.body.username }, 
     function(err, user) { 
    if (err) throw err; 
console.log(user); 
user.comparePassword(req.body.password, function(err, isMatch) { 
    if (err) throw err; 
    console.log('Password Match:', isMatch); 
});}); 

方法:

UserCredentialSchema.methods.comparePassword = function(pwd, cb) { 
bcrypt.compare(pwd, this.password, function(err, isMatch) { 
    console.log(this.password); 
    if (err) return cb(err); 
    cb(null, isMatch); 
});}; 

答えて

0

あなたは 'この'

の正しいコンテキストをバインドする(thisArg、ARG1、ARG2、...)function.callでcomparePasswordを呼び出す必要がありますそうbasiciallyの代わり:

user.comparePassword(req.body.password, function(err, isMatch) { 
    if (err) throw err; 
    console.log('Password Match:', isMatch); 
}); 

使用:

user.comparePassword.call(this, req.body.password, function(err, isMatch) { 
    if (err) throw err; 
    console.log('Password Match:', isMatch); 
}); 

参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

-1

あなたはcompareSync()の代わりcompare()を比較してみてください。これはあなたのために動作することを願っています。

UserCredentialSchema.methods.comparePassword = function(pwd, cb) { 
     bcrypt.compareSync(pwd, this.password, function(err, isMatch) { 
      console.log(this.password); 
      if (err) return cb(err); 
      cb(null, isMatch); 
     }); 
    }; 
+1

'compareSync'はコールバックしません – robertklep

関連する問題