【发布时间】:2017-05-05 10:59:16
【问题描述】:
我正在尝试使用 mongodb 用户模型实现护照 js 身份验证。现在如您所见,我在用户模型上创建了一个方法。因此,当我将此方法应用于用户实例时,我希望“this”能够保存所有用户对象。但在这种情况下并没有发生这种情况。以下是一个工作代码,但我已经传递了一个额外的变量来使其工作。但我不想那样做。我在哪里犯错了?
下面是用于登录的护照配置文件
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);
【问题讨论】:
-
试试
function (password, x) {而不是(password, x) => -
嗨@GrégoryNEUT,感谢您的帮助。这件事工作得很好。但我的问题是
console.log(this)上方的行返回了一个空值。但这应该返回一个用户对象。至少这是我期望它做的:-( -
问题是当你使用箭头函数(ES语法)时,函数内部的上下文是继承的。如果即使使用常规上下文,您也可以从此处访问用户,但您可以尝试。
-
哦……它成功了。我不知道 => 和函数之间的细微差别......将需要阅读它们。感谢您的指导。
-
我把它作为答案来结束你的问题。
标签: javascript node.js mongodb mongoose passport.js