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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 13:45:07