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

Express登录请求报密码不一致校验错误 无法为用户追加JWT token

错误原因定位

1. 异步方法未添加await执行

你定义的appendToken是异步方法,内部包含await user.save()操作,但是在控制器中调用user.appendToken(token)时没有添加await关键字,会引发两个问题:

  • save操作还未执行完成就提前返回了响应,因此客户端拿到的user数据还未更新tokens数组
  • 异步方法抛出的错误无法被外层的try/catch捕获,导致异常没有被正确处理

2. password_confirm字段校验触发

你的user模型中password_confirm字段设置了required: true,但该字段仅在用户注册/修改密码场景下需要使用,其他场景下save用户实例时,该字段的值为undefined:

  • 当前的pre-save中间件只有在密码被修改的时候才会操作password_confirm,当你仅更新tokens数组触发save时,pre-save直接跳过了处理password_confirm的逻辑,Mongoose执行全局校验时发现必填的password_confirm字段为空,直接抛出ValidationError

修复方案

  1. 控制器中调用appendToken时添加await关键字:
// 原代码
user.appendToken(token);
// 修改后
await user.appendToken(token);
  1. 调整password_confirm字段的required规则,仅在新建用户时要求必填:
password_confirm: {
  type: String,
  required: function() {
    // 仅新建用户时需要必填
    return this.isNew;
  },
  validate: {
    validator: function (val) {
      return val === this.password;
    },
    message: 'Passwords are not same',
  },
}

内容的提问来源于stack exchange,提问作者Ahsan Danish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:03