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
相关产品推荐
相关产品推荐

