升级Mongoose至6.6.1后调用.save()出现owner.$populated is not a function验证错误
问题:Mongoose升级至6.6.1后Date字段验证报错(owner.$populated is not a function)
将Mongoose版本升级至6.6.1后,调用Document的save()方法时触发验证错误,此前该操作可正常保存数据。涉及Date类型字段,但字段格式看似无误,报错信息提示owner.$populated is not a function,且错误提及了未在代码中定义的owner字段。
相关对象代码
new MyTask({ "source": { "client_id" : "ABC", "ip" : "127.0.0.1" }, "invoice": { "amount" : 1000, "currency" : "eur", "dueAt" : "2022-10-23T14:55:57.482Z", "issuedAt" : "2022-07-25T13:55:57.480Z", "number" : "724/001" } }).save();
Schema定义
var invoice_schema = new Schema({ "amount" : {type:Number, required:true}, "currency" : {type:String, required:true}, "dueAt" : {type:Date, required:true}, "issuedAt" : {type:Date, required:true}, "number" : {type:String} }, { timestamps:true, toObject : { virtuals: true }, toJSON : { virtuals: true } }); var MYTASK_SCHEMA = new Schema( { source : { ip : {type: String}, client_id : {type: String} }, invoice: {type : invoice_schema} }, { timestamps:true, toObject: { virtuals: true }, toJSON : { virtuals: true } });
报错信息
Error: MyTask validation failed: invoice.dueAt: owner.$populated is not a function, invoice.issuedAt: owner.$populated is not a function, invoice: Validation failed: dueAt: owner.$populated is not a function, issuedAt: owner.$populated is not a function at ValidationError.inspect (/app/node_modules/mongoose/lib/error/validation.js:48:26) at formatValue (node:internal/util/inspect:790:19) at inspect (node:internal/util/inspect:350:10) at formatWithOptionsInternal (node:internal/util/inspect:2241:40) at formatWithOptions (node:internal/util/inspect:2103:10) at console.value (node:internal/console/constructor:348:14) at console.warn (node:internal/console/constructor:381:61)
问题原因
这是Mongoose 6.6.x版本的已知bug:当嵌套Schema包含Date类型字段,且该Schema开启了virtuals: true配置时,内部验证逻辑会出现异常。错误中提到的owner是Mongoose内部用于跟踪文档关联关系的对象,并非你代码中定义的业务字段。
解决方法
有三种可行方案:
- 降级版本:暂时回退到Mongoose 6.5.x版本(如6.5.4),该版本不存在此验证bug,可恢复正常保存逻辑。
- 临时修改Schema配置:若需保留6.6.1版本,可关闭嵌套Schema的
virtuals选项(将invoice_schema配置中的toObject和toJSON里的virtuals: true改为false),待官方修复后再重新开启。 - 升级至修复版本:该bug在Mongoose 6.7.x及后续版本中已被修复,直接升级到这些版本即可解决问题。
内容的提问来源于stack exchange,提问作者DeLac
相关产品推荐
相关产品推荐

