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

