在mongoose中进行预更新时,user.isModified不是函数

时间:2016-10-20 18:03:02

标签: node.js mongodb mongoose schema

我正在尝试在我正在构建的应用中散列密码,并且当我通过调用此函数创建用户时它们正在散列(coffeesctipt):

UserSchema.pre 'save', (next) ->
  user = this
  hashPass(user, next)

hashPass = (user, next) ->
  # only hash the password if it has been modified (or is new)
  if !user.isModified('password')
    return next()
  # generate a salt
  bcrypt.genSalt SALT_WORK_FACTOR, (err, salt) ->
    if err
      return next(err)
    # hash the password using our new salt
    bcrypt.hash user.password, salt, (err, hash) ->
      if err
        return next(err)
      # override the cleartext password with the hashed one
      user.password = hash
      next()
      return
    return

但是当我做更新并且有这个前:

UserSchema.pre 'findOneAndUpdate', (next) ->
  user = this
  hashPass(user, next)

我得到TypeError: user.isModified is not a function如果我在预先登录日志用户我正在更新的用户,找不到更新的用户,找不到前面的那个,或者我需要在那里访问文件另一种方式吗?

3 个答案:

答案 0 :(得分:7)

由于箭头功能更改了'this'的范围,因此会出现错误。 只需使用

UserSchema.pre('save', function(next){})

答案 1 :(得分:1)

我在打字稿上有类似的问题,结果证明这与你也在使用的箭头操作符有关。不知道如何在coffescript中改变这一点,但我认为这应该可以解决你的问题。

你必须改变这一行:

hashPass = (user, next) ->

检查出来:https://github.com/Automattic/mongoose/issues/4537

答案 2 :(得分:0)

我知道这对您来说可能为时已晚,但是对于任何将来遇到此问题的编码人员,我认为此解决方案应该有效。 因此,由于save()是.pre中的中间件,因此它会覆盖猫鼬的某些方法,例如findByIDAndUpdate。您可能想做的是,而不是使用它,如果某个地方发出了补丁请求,请像这样破坏代码:

const user = await User.findById(req.params.id);
    updates.forEach((update) => {
      user[update] = req.body[update];
    });