如何向自定义Validator传递参数?以前缀数组校验为例
如何将前缀字符串数组传入自定义校验器并访问参数?
你可以通过以下两种方式实现需求:
方式一:直接使用@Validate传递参数
1. 修改校验器逻辑,从ValidationArguments获取参数
在校验器的validate方法中,通过validationArguments.constraints获取传入的前缀数组:
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator'; @ValidatorConstraint({ name: 'prefixValidator' }) class PrefixValidator implements ValidatorConstraintInterface { validate(value: string, validationArguments?: ValidationArguments): boolean { // 提取传入的前缀数组 const prefixes = validationArguments?.constraints[0] as string[]; // 处理空前缀的边界情况 if (!prefixes || prefixes.length === 0) { return false; // 或根据业务需求返回true } return prefixes.some(prefix => value.startsWith(prefix)); } // 可选:自定义错误提示消息 defaultMessage(validationArguments?: ValidationArguments): string { const prefixList = validationArguments?.constraints[0].join(', '); return `字符串必须以 ${prefixList} 中的某个前缀开头`; } }
2. 在DTO中传递前缀数组
在@Validate装饰器的第二个参数中传入前缀数组:
import { Validate } from 'class-validator'; class DTO { @Validate(PrefixValidator, [['foo', 'bar', 'baz']]) // 传入前缀数组作为约束参数 myString: string; }
方式二:自定义装饰器(更优雅的使用方式)
如果需要频繁使用该校验,可以封装成自定义装饰器,简化调用:
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, registerDecorator, ValidationOptions } from 'class-validator'; @ValidatorConstraint({ name: 'prefix' }) class PrefixValidator implements ValidatorConstraintInterface { validate(value: string, args: ValidationArguments) { const prefixes = args.constraints[0]; return prefixes.some(prefix => value.startsWith(prefix)); } defaultMessage(args: ValidationArguments) { return `输入内容必须以 ${args.constraints[0].join(', ')} 中的某个前缀开头`; } } // 封装自定义装饰器 function Prefix(prefixes: string[], validationOptions?: ValidationOptions) { return function (object: Object, propertyName: string) { registerDecorator({ target: object.constructor, propertyName: propertyName, options: validationOptions, constraints: [prefixes], validator: PrefixValidator, }); }; } // 使用自定义装饰器 class DTO { @Prefix(['foo', 'bar']) // 直接传入前缀数组 myString: string; }
核心原理
ValidationArguments对象的constraints属性会存储我们在装饰器中传入的所有额外参数,通过索引即可取出对应的前缀数组。
内容的提问来源于stack exchange,提问作者Kacy
相关产品推荐
相关产品推荐

