Mongoose bcryptjs比较密码没有引用文件(这个)

时间:2017-07-28 16:32:15

标签: node.js mongodb passport.js mongoose-schema

我有像这样的猫鼬模式

var mongoose  = require ('mongoose');
var bcrypt = require('bcryptjs');
var Schema = mongoose.Schema;
var SALT_WORK_FACTOR = 10;
var touristSchema = new Schema ({
    local: {
        email: String,
        password: String
    },
    facebook: {
        id: String,
        token: String,
        email: String,
        name: String,
    }
});


touristSchema.pre('save', function(next) {
    var user = this;
    console.log('bcrypt called by strategy', user);

// if user is facebook user skip the pasword thing.
if (user.facebook.token) {
    next();
}
// only hash the password if it has been modified (or is new)
if (!user.isModified('password') && !user.isNew){
console.log('I am in here', user.isNew);
return next();
}
// generate a salt
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
    console.log('I am in genSalt');

    if (err) return next(err);

    // hash the password using our new salt
    bcrypt.hash(user.local.password, salt, function(err, hash) {
        if (err) return next(err);

        // override the cleartext password with the hashed one
        user.local.password = hash;
        next();
    });
  });
 });

touristSchema.methods.comparePassword = function(candidatePassword, cb) {
    bcrypt.compare(candidatePassword, this.local.password, function(err, isMatch) {
        // console.log(this.local.password);

        if (err) return cb(err);
        cb(null, isMatch);
    });
};

module.exports = mongoose.model('users', touristSchema);

和像这样的登录策略

passport.use('local-login', new LocalStrategy({
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true
    },
    function(req, email, password, done) {
        process.nextTick(function() {
                User.findOne({ 'local.email': email }, function(err, user) {
                    if(err)
                        return done(err);
                    if(!user)
                        return done(null, false, req.flash('loginMessage', 'No User Found'));
                user.comparePassword(password, function(err, isMatch) {
          if (err) throw err;
                    if (isMatch) {
                            done(null, user);
                    }
                    else
                         done(null, false, req.flash('loginMessage', 'Incorrect password'));
      });
        });
    });
 }
));

一切都按预期工作但当我尝试登录时却给出了错误: TypeError:无法读取属性'密码'未定义。 结果是 this.local 未定义。 这在我们分配touristSchema.pre的{​​{1}}挂钩以及记录此返回的用户文档时非常奇怪。在比较方法中,我们使用var user = this,那么touristSchema.methods.compare应该引用mongoose中间件文档中编写的文档。我现在正在打它几天,并且尽可能地消耗了所有可用的帮助。任何帮助都提前非常感谢。谢谢 是的,我的 mongnodb版本是v3.2.15
猫鼬版是4.9.7
根据mongoose docs看起来与我兼容

0 个答案:

没有答案