неопределенное поле в схеме мангуста

#node.js #mongoose #bcrypt

#node.js #мангуст #bcrypt

Вопрос:

Я получаю неопределенное поле, пытаясь сравнить пароль пользователя

это функция

 logUser = (req,res) => {
       User.findOne({ username:req.body.username}, (err,user) => {
            if(!user){
                req.flash('error','El nombre de usuario no existe');
                res.redirect('/login');
            }else if(!user.comparePassword(req.body.password)){
                req.flash('error','La contraseña no es correcta');
                res.redirect('/login');
            }else{
                res.redirect('/');
            }
       });
    }
  

когда выполнение переходит к функции else if и использует comparePassword поле схемы undefined

файл схемы

 const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const bcrypt = require('bcrypt');

const userSchema = Schema({
    username:String,
    email:String,
    password:String,
    registrationDate: {type:Date, defaul: Date.now()}
});

userSchema.methods.encryptPassword = (password) =>{
    return bcrypt.hashSync(password, bcrypt.genSaltSync(10));
}

userSchema.methods.comparePassword = (password) =>{
    console.log('password: ',this.password);
    return bcrypt.compareSync(password, this.password);//here this.password is undefined
}

module.exports = mongoose.model('User',userSchema)
  

Отладка Я увидел, что user объект не является классом schem, что происходит с классом tuis?

Ответ №1:

Короче говоря, это будет работать, если вы замените

 userSchema.methods.comparePassword = (password) =>{
    console.log('password: ',this.password);
    return bcrypt.compareSync(password, this.password);//here this.password is undefined
}
  

с

 userSchema.methods.comparePassword = function(password) {
    console.log('password: ',this.password);
    return bcrypt.compareSync(password, this.password);//here this.password is undefined
}
  

Вы столкнулись с проблемой lexical scoping из-за of arrow function . Функция Arrow наследует свою this область действия от родительской.