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

Mongoose Schema数组对象字段设置默认值触发日期转换错误如何解决

Mongoose数组字段默认值配置报错解决方案

报错原因

该报错由数组字段默认值的写法错误导致:外层default配置的静态数组中直接传入了Date.now函数引用,Mongoose解析静态数组默认值时不会自动执行子项里的函数,会直接把函数对象本身尝试转换为日期类型,最终抛出类型转换失败的错误。
除此之外,直接在静态默认值中写死时间值、传入未执行的时间函数,还会导致所有新文档的默认时间为Schema加载时的固定值,不会随文档创建时间动态生成,本身也不符合常规业务预期。

正确配置方式

两种常用的正确写法,按需选择即可:

  • 写法1(推荐,最简洁):子文档内部已经给所有字段配置了默认值的前提下,外层数组默认值只需要传入包含空对象的数组,Mongoose会自动为每个空对象填充子文档定义好的所有默认值,不会出现类型错误,也能保证时间值是文档创建时动态生成的
statusData: {
  type: [
    {
      status: { ...trimmedString, required: false, default: 'new' },
      createdAt: {
        type: SchemaTypes.Date,
        required: false,
        default: Date.now
      },
      updatedAt: {
        type: SchemaTypes.Date,
        required: false,
        default: null
      },
    },
  ],
  // 仅声明默认存在1条子文档,子项字段默认值由子Schema自动填充
  default: [{}]
}
  • 写法2:如果需要在外层默认值中自定义初始子项内容,要把default配置为返回数组的函数,动态计算生成默认值,不要用静态固定数组:
statusData: {
  type: [
    {
      status: { ...trimmedString, required: false, default: 'new' },
      createdAt: {
        type: SchemaTypes.Date,
        required: false,
        default: Date.now
      },
      updatedAt: {
        type: SchemaTypes.Date,
        required: false,
        default: null
      },
    },
  ],
  // 默认值用函数返回,每次创建文档时动态执行生成值
  default: () => {
    return [
      {
        status: 'new',
        // 手动传时间时要执行Date.now()拿到实际时间戳,不要直接传Date.now引用
        // 实际使用时可以省略createdAt、updatedAt、status字段,让子Schema的默认值自动填充
        createdAt: Date.now(),
        updatedAt: null
      }
    ]
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:03:12