Mongoose模型的静态/方法不在“this”中保存值

我试图用mongodb用户模型实施护照jsauthentication。 现在你可以看到,我已经在用户模型上创build了一个方法。 因此,当我在用户的实例上应用这个方法时,我期望“this”能够保存所有的用户对象。 但在这种情况下不会发生这种情况。 以下是一个工作代码,但我已经传递了一个额外的variables,使其工作。 但我不想这样做。 我在哪里犯错误?

下面是login的护照configuration文件

var passport = require('passport'); var User = require('../models/users'); var LocalStrategy = require('passport-local').Strategy; passport.serializeUser((user, done)=>{ done(null, user.id); }); passport.deserializeUser((id, done)=>{ User.findById(id, (err, user)=>{ done(err, user); }); }); passport.use('local.signin', new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true },(req, email, password, done) => { User.findOne({email:email}, (err, user) => { if (err){ return done(err)} if (!user){return done(null, false, {message:'This email is not registered'})} if (!user.validatePassword(password, user.password)){ /**********************************************/ //is this field user.password really necessary? /**********************************************/ return done(null, false, {message: 'Authentication Failed'}) } else { return done(null, user); } }); })); 

用户模型如下所示:

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var bcrypt = require('bcrypt-nodejs'); var userSchema = new Schema({ salutation: {type: String, required: false}, firstname: {type: String, required: true}, lastname: {type: String, required: false}, email: {type: String, required: true}, password: {type: String, required: true} }); userSchema.methods.validatePassword = (password, x) => { console.log(this); //this is returning null return bcrypt.compareSync(password, x); /*********************************************************/ //I was excepting this.password to work instead of using x /*********************************************************/ } userSchema.methods.myCourses = (userId) => { console.log(this.enrolledFor); } module.exports = mongoose.model('User', userSchema); 

ECMA2015标准也称为ES6允许使用箭头函数,这些函数从上下文inheritance他们的上下文。

soluce是使用规则的函数语法。

 userSchema.methods.validatePassword = function (password, x) { console.log(this); //this is returning null return bcrypt.compareSync(password, x); /*********************************************************/ //I was excepting this.password to work instead of using x /*********************************************************/ } ---------- 

关于箭头function的文章

CoffeeScript(一种经过编译的语言)的箭头函数(也称为“胖箭头”函数)是编写函数expression式的更简洁的语法。 他们利用一个新的标记=>,看起来像一个胖箭头。 箭头函数是匿名的,并改变了这种函数绑定的方式。

箭头函数使我们的代码更简洁,并简化函数范围和这个关键字。 它们是一行迷你函数,与其他语言(如C#或Python)中的Lambdas非常类似。 (另请参见JavaScript中的lambdas)。 通过使用箭头函数,我们避免了input函数关键字,返回关键字(它隐含在箭头函数中)和花括号。

与函数expression式相比,箭头函数expression式具有更短的语法,并且不绑定它自己的this,arguments,super或new.target。 箭头function始终是匿名的。 这些函数expression式最适合非方法函数,不能用作构造函数。 developer.mozilla