如何获取Mongoose Schema中配置的所有验证器列表?
获取Mongoose Schema验证器列表的实现方案
Mongoose 没有原生提供getValidators()方法,可以通过遍历Schema实例的路径属性,自行提取所有字段的校验规则。
注意:示例中直接写的普通JS对象不是Mongoose Schema实例,必须先将字段定义传入mongoose.Schema构造函数生成实例后,才能读取到挂载的验证配置。
具体实现步骤
- 首先基于字段定义创建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: '年龄必须为整数' } } });
- 编写通用提取方法,遍历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.
相关产品推荐
相关产品推荐

