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

如何获取Mongoose Schema中配置的所有验证器列表?

获取Mongoose Schema验证器列表的实现方案

Mongoose 没有原生提供getValidators()方法,可以通过遍历Schema实例的路径属性,自行提取所有字段的校验规则。
注意:示例中直接写的普通JS对象不是Mongoose Schema实例,必须先将字段定义传入mongoose.Schema构造函数生成实例后,才能读取到挂载的验证配置。


具体实现步骤

  1. 首先基于字段定义创建Mongoose Schema实例
const mongoose = require('mongoose');
const { Schema } = mongoose;

const userSchema = new Schema({
  firstName: {
    type: String,
    required: true,
    minlength: 2,
    maxlength: 20,
    match: /^[a-zA-Z]+$/
  },
  age: {
    type: Number,
    min: 18,
    max: 120,
    validate: {
      validator: v => v % 1 === 0,
      message: '年龄必须为整数'
    }
  }
});
  1. 编写通用提取方法,遍历Schema的所有字段路径,读取挂载的验证规则
function getSchemaValidators(schema) {
  const validatorsConfig = {};

  schema.eachPath((fieldPath, pathMeta) => {
    // 跳过Mongoose自动生成的_id、__v内置字段,不需要可以删除该判断
    if (['_id', '__v'].includes(fieldPath)) return;

    const fieldRules = {
      type: pathMeta.instance,
      required: !!pathMeta.isRequired
    };

    // 遍历字段上挂载的所有验证器
    if (pathMeta.validators?.length) {
      pathMeta.validators.forEach(rule => {
        switch(rule.type) {
          case 'min':
            fieldRules.min = rule.min;
            break;
          case 'max':
            fieldRules.max = rule.max;
            break;
          case 'minlength':
            fieldRules.minlength = rule.minlength;
            break;
          case 'maxlength':
            fieldRules.maxlength = rule.maxlength;
            break;
          case 'regex':
            fieldRules.match = rule.regex;
            break;
          case 'enum':
            fieldRules.enum = rule.enumValues;
            break;
          case 'user defined':
            fieldRules.customValidate = {
              validator: rule.validator,
              message: rule.message
            };
            break;
        }
      });
    }

    validatorsConfig[fieldPath] = fieldRules;
  });

  return validatorsConfig;
}

调用效果

直接传入Schema实例调用即可,输出结构和预期一致:

const result = getSchemaValidators(userSchema);
console.log(result);
/* 输出
{
  firstName: {
    type: 'String',
    required: true,
    minlength: 2,
    maxlength: 20,
    match: /^[a-zA-Z]+$/
  },
  age: {
    type: 'Number',
    required: false,
    min: 18,
    max: 120,
    customValidate: {
      validator: v => v % 1 === 0,
      message: '年龄必须为整数'
    }
  }
}
*/

补充说明

  • 如果是从已注册的Mongoose Model上提取规则,可以直接通过Model.schema拿到Schema实例传入方法,不需要额外保存Schema引用。
  • 处理嵌套对象、数组类型字段时,eachPath会自动遍历到深层路径,路径名格式为父字段.子字段,如果需要嵌套结构的返回值,在方法里加一层路径拆分递归组装即可。
  • unique属于MongoDB层面的唯一索引约束,不属于Mongoose验证器,如果需要提取该配置,可以单独读取pathMeta.options.unique属性。

内容的提问来源于stack exchange,提问作者Rinoj A.J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:54:18