如何使用Mongoose自定义校验器实现age存在时birthYear不为空的校验
问题原因
你原来的实现存在两个核心逻辑错误:
- age是Number类型,不存在
length属性,!this.age.length的判断永远为真,导致required的条件逻辑完全不符合预期 - 自定义校验函数的返回规则搞反了:Mongoose校验器返回
true代表校验通过,返回false代表校验失败。你原来的写法是当age存在且birthYear为空时返回true,等于允许了空值通过校验
正确实现
你只需要正确配置required的条件函数即可满足需求,不需要额外写自定义校验器,实现代码如下:
const mongoose = require('mongoose'); const person = new mongoose.Schema({ age: { type: Number }, birthYear: { type: String, // 条件:当age字段存在且不为null/undefined时,birthYear必填 required: function () { return this.age != null; } }, fullName: { type: String } })
如果要额外加自定义校验逻辑限制birthYear的格式(比如必须是4位数字),再追加validate配置即可:
const person = new mongoose.Schema({ age: { type: Number }, birthYear: { type: String, required: function () { return this.age != null; }, validate: { validator: function(v) { // 当age存在时,birthYear必须是4位数字 if (this.age != null) { return /^\d{4}$/.test(v); } // age不存在时不校验直接通过 return true; }, message: '出生年份必须为4位数字' } }, fullName: { type: String } })
注意事项
- 条件函数不要用箭头函数,否则会丢失
this指向,无法获取当前文档的字段值 - 校验默认只在
save()、create()时触发,如果要在update类操作时触发校验,需要手动开启runValidators: true配置
内容的提问来源于stack exchange,提问作者Peoray
相关产品推荐
相关产品推荐

