考虑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;
}如何在validator方法中有条件地设置/覆盖message字符串?这可能吗?
发布于 2021-05-10 21:32:07
找到了:
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
},
});
};
}https://stackoverflow.com/questions/67469422
复制相似问题