[英]javascript/typescript | class-validator | custom validation decorators | override the `validationOptions` inside the `validator` method
Consider the example provided in section Custom validation decorators :考虑自定义验证装饰器部分中提供的示例:
// Decorator definition
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';
export function IsLongerThan(property: string, validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
name: 'isLongerThan',
target: object.constructor,
propertyName: propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = (args.object as any)[relatedPropertyName];
return typeof value === 'string' && typeof relatedValue === 'string' && value.length > relatedValue.length; // you can return a Promise<boolean> here as well, if you want to make async validation
},
},
});
};
}
// Decorator usage
import { IsLongerThan } from './IsLongerThan';
export class Post {
title: string;
@IsLongerThan('title', {
/* you can also use additional validation options, like "groups" in your custom validation decorators. "each" is not supported */
message: 'Text must be longer than the title',
})
text: string;
}
How can I set/override the message
string conditionally, inside the validator
method?如何在
validator
方法中有条件地设置/覆盖message
字符串? Is this possible?这可能吗?
Found it:找到了:
export function IsLongerThan(property: string, validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
let message;
const validate = function (value: any, args: ValidationArguments) {
// Set message based on some validation logic
// message = ...
}
const defaultMessage = function () {
return message;
}
registerDecorator({
name: 'isLongerThan',
target: object.constructor,
propertyName: propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate,
defaultMessage
},
});
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.