You need to enable JavaScript to run this app. Node.js 中 Mongoose 的 passwordChangedAt Date 字段为何未存入数据库
优惠活动
大模型
产品
解决方案
定价
更多

Node.js 中 Mongoose 的 passwordChangedAt Date 字段为何未存入数据库

问题根因
  • 核心问题出在传入的测试值"12-4-2021"本身无法被Mongoose的默认日期转换逻辑识别为合法Date对象。Mongoose默认仅兼容解析ISO 8601、RFC2822标准格式的日期字符串,这种短横拼接的自定义日-月-年格式不在识别范围内,传入后会被判定为Invalid Date。
  • 由于passwordChangedAt字段没有配置required校验规则,Mongoose遇到类型转换失败的非必填字段时,会执行静默丢弃逻辑:既不抛出报错,也不将该字段写入数据库,最终就出现了查询时找不到这个字段的现象。
解决方法
  • 临时验证:测试时换成Mongoose可识别的标准日期格式即可正常存储,比如把测试数据里的"passwordChangedAt" : "12-4-2021"替换为ISO格式值"2021-04-12",重新发起写入后字段就能正常落库。
  • 自定义格式适配:如果业务场景必须接收DD-MM-YYYY这类非标准格式的日期,给对应字段添加自定义setter做格式转换即可,示例配置:
// 替换原Schema中passwordChangedAt的字段定义
passwordChangedAt: {
  type: Date,
  set: (rawValue) => {
    // 匹配短横分隔的数字日期格式
    if (typeof rawValue === 'string' && /^\d{1,2}-\d{1,2}-\d{4}$/.test(rawValue)) {
      const [day, month, year] = rawValue.split('-').map(Number);
      // JS Date的月份从0开始计数,需要手动减1避免偏移
      return new Date(year, month - 1, day);
    }
    return rawValue;
  }
}
  • 排查逻辑优化:为了避免后续再出现无提示丢字段的问题,可以给日期字段补充有效性校验,一旦转换得到非法Date就抛出明确错误,不会悄无声息丢失数据:
passwordChangedAt: {
  type: Date,
  validate: {
    validator: (value) => value instanceof Date && !isNaN(value.getTime()),
    message: '传入的日期格式不合法'
  }
}

内容的提问来源于stack exchange,提问作者Enjoying Videos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 12:24:04