You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:57:51