在Javascript ES6中使用此关键字

在Javascript ES6中使用此关键字,javascript,node.js,mongoose,ecmascript-6,Javascript,Node.js,Mongoose,Ecmascript 6,我正在用ES6开发Node.js应用程序 用于在保存到MongoDB之前加密和解密密码 有模式定义: import mongoose from 'mongoose' import bcrypt from 'bcrypt-nodejs' const Schema = mongoose.Schema let userSchema = new Schema({ username: { type: String, min: 6, max: 20, unique:

我正在用ES6开发Node.js应用程序

用于在保存到MongoDB之前加密和解密密码

有模式定义:

import mongoose from 'mongoose'
import bcrypt from 'bcrypt-nodejs'

const Schema = mongoose.Schema

let userSchema = new Schema({
  username: {
    type: String,
    min: 6,
    max: 20,
    unique: true,
    required: true,
    dropDups: true
  },
  password: {
    type: String,
    min: 6,
    max: 20
  }
})

// generate password hash
userSchema.methods.generateHash = password => bcrypt.hashSync(password, bcrypt.genSaltSync(8), null)

// checking if password is valid
userSchema.methods.validPassword = password => bcrypt.compareSync(password, this.password)

export default mongoose.model('User', userSchema)
当我想验证用户密码时,我调用以下函数:

if (!user.validPassword(req.body.password)) {
          console.error(`Authentication failed. Wroong password for user     '${req.body.username}'`)
        }
然后发生错误:

events.js:182
      throw er; // Unhandled 'error' event
      ^

TypeError: Cannot read property 'password' of undefined
我认为这个问题是由
ES6语法
引起的,
这个
是未定义的。但我不知道我怎么能修好它


提前感谢大家。

不要使用箭头功能。这些方法中的
this
上下文是在创建模型实例时在模型实例的上下文中获取的,而不是在模式的组合中。如果您使用常规的
函数()
语法,那么您将没有problem@NeilLunn谢谢你在这里发表评论。你知道有什么方法可以让它使用箭头功能吗?我想学习ES6,所以我会撒谎说使用ES6语法,比如箭头函数。关键是它不能工作。原因是,基本上你在这里写的更像是“将变量声明为函数”“创建时将附加到模型实例的。这是一个老的JavaScript技巧,箭头函数不适用,因为我们实际上希望
This
引用生成的实例。不要使用箭头函数。这些方法中的
this
上下文是在创建模型实例时在模型实例的上下文中获取的,而不是在模式的组合中。如果您使用常规的
函数()
语法,那么您将没有problem@NeilLunn谢谢你在这里发表评论。你知道有什么方法可以让它使用箭头功能吗?我想学习ES6,所以我会撒谎说使用ES6语法,比如箭头函数。关键是它不能工作。原因是,基本上,您在这里编写的内容更像是“将变量声明为函数”,在创建时将附加到模型实例。这是一个古老的JavaScript技巧,并且箭头函数不适用,因为我们实际上希望
引用生成的实例。