Mongoose中isModified方法究竟在检查什么?
搞懂Mongoose里的isModified到底干啥用的
你之前的理解完全跑偏了,这个isModified("password")根本不是用来对比新密码和旧密码的,核心作用是避免重复哈希密码。
给你掰碎了说:
- Mongoose的
pre("save")中间件是每次调用save()都会触发的——不管你是新建用户,还是只改了用户的昵称、邮箱这类非密码字段,只要调用save(),这个中间件就会跑一遍。 - 如果不加这个判断,会出大问题:比如用户只是改了个昵称,这时候密码字段本来已经是哈希后的字符串了,中间件会把这个哈希值再哈希一遍,结果就是用户下次登录用原密码根本匹配不上,因为密码被重复哈希了。
看你贴的代码:
- 当
this.isModified("password")返回true,说明password字段确实被修改了(比如新建用户时设初始密码,或者用户主动改密码),这时候才需要生成盐、哈希新密码,替换掉原密码。 - 如果返回
false,说明password字段没动过,直接跳过哈希步骤,继续执行后续逻辑就行。
代码示例:
schema.pre("save", async function(next) { if (!this.isModified("password")) { return next(); } try { const salt = await bcrypt.genSalt(10); let hashedPassword = await bcrypt.hash(this.password, salt); this.password = hashedPassword; return next(); } catch (error) { return next(error); } });
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

