encryption与护照和mongoose的错误

Bcrypt抛出一个Incorrect arguments错误,我追溯到user.js这个函数

 userSchema.methods.comparePassword = (candidatePassword, callback) => { bcrypt.compare(candidatePassword, this, (err, isMatch) => { console.log('candidatePassword= ', candidatePassword, '& this= ', this); if (err) { return callback(err); } callback(null, isMatch); }); }; /* candidatePassword= bird this= {} this.password= undefined */ 

用户对象回来作为一个空的对象,因此this.password是未定义的。 我假设bcrypt.compare中的this参数指向了userSchema实例。 userSchema在passport.js声明

 const passport = require('passport'); const ExtractJwt = require('passport-jwt').ExtractJwt; const JwtStrategy = require('passport-jwt').Strategy; const LocalStrategy = require('passport-local').Strategy; const User = require('../models/user'); const config = require('../config'); var localOptions = { usernameField: 'email', }; // Verifies user by checking if a password matches the specified email during signin var localStrategy = new LocalStrategy(localOptions, function (email, password, done) { User.findOne({ email:email.toLowerCase()}, function (err, user) { console.log('/passport.js/localStrategy- user object: ', user) if (err) { return done(err); } if (!user) { return done(null, false); } user.comparePassword(password, function (err, isMatch) { console.log('/passport.js/localStrategy- password: ', password) if (err) { return done(err); } if (!isMatch) { return done(err, false); } return done(null, user); }); }); }); // ... jwt strategy ... passport.use(localStrategy); /* user object: { _id: 58a1018dc3f89eb5955b8638, email: 'bird@bird.com', password: '$2a$10$lAJ9hoGKt9ggfk1TISfkOedxDIs/waLB5e4PccHAKt286XCKCY0/q', __v: 0 } */ 

我不知道是什么问题,因为它似乎是一个用mongodbencryption的密码字段返回的用户对象,并user.comparepassword()

我也用相同的Schema对象对用户进行了签名。

任何帮助/提示表示赞赏!

你只是设置你的模型,以便它拉入候选密码,但从来没有从数据库中find存储的密码。 由于这是返回一个空的对象,或者电子邮件没有被匹配,或者密码没有被比较存储。 尝试简化comparePassword函数并将“同步”添加到bcrypt.compare,从而消除callback的需要。

在模型中:

 userSchema.methods.comparePassword = (candidatePassword) => { return bcrypt.compareSync(candidatePassword, this.password); };