我正在尝试在我正在构建的应用中散列密码,并且当我通过调用此函数创建用户时它们正在散列(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
如果我在预先登录日志用户我正在更新的用户,找不到更新的用户,找不到前面的那个,或者我需要在那里访问文件另一种方式吗?
答案 0 :(得分:7)
由于箭头功能更改了'this'的范围,因此会出现错误。 只需使用
UserSchema.pre('save', function(next){})
答案 1 :(得分:1)
我在打字稿上有类似的问题,结果证明这与你也在使用的箭头操作符有关。不知道如何在coffescript中改变这一点,但我认为这应该可以解决你的问题。
你必须改变这一行:
hashPass = (user, next) ->
答案 2 :(得分:0)
我知道这对您来说可能为时已晚,但是对于任何将来遇到此问题的编码人员,我认为此解决方案应该有效。 因此,由于save()是.pre中的中间件,因此它会覆盖猫鼬的某些方法,例如findByIDAndUpdate。您可能想做的是,而不是使用它,如果某个地方发出了补丁请求,请像这样破坏代码:
const user = await User.findById(req.params.id);
updates.forEach((update) => {
user[update] = req.body[update];
});