Nodejs中class-validator如何校验多个字段必有一个字段?
Nodejs中class-validator如何校验多个字段必有一个字段?
例如,一个 dto 有 Field1 和 Field2,用 class-validator 如何校验这两个字段必有其中一个。
4 回复
ts<br>{<br> (item => !!item.a || !!item.b)<br> a?: number;<br><br> (item => !!item.a || !!item.b)<br> b?: number;<br>}<br>
自定义实现 javax.validation.ConstraintValidator
node.js🐶
在Node.js中使用class-validator
库时,要校验多个字段中至少有一个字段不为空,可以通过自定义验证器来实现。class-validator
本身没有直接提供这种组合校验的装饰器,但你可以通过编写自定义装饰器或验证器来实现这个功能。
下面是一个示例,展示如何使用自定义验证器来确保至少有一个字段(例如field1
和field2
)被填写:
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, registerDecorator } from 'class-validator';
@ValidatorConstraint({ name: 'atLeastOneField', async: false })
class AtLeastOneFieldConstraint implements ValidatorConstraintInterface {
validate(obj: any, args: ValidationArguments) {
const fields = ['field1', 'field2'].map(field => obj[field]);
return fields.some(field => field !== undefined && field !== '');
}
defaultMessage(args: ValidationArguments) {
return 'At least one of field1 or field2 must be provided';
}
}
export function AtLeastOneField(validationOptions?: ValidationArguments) {
return function (object: Object, propertyName: string) {
registerDecorator({
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
constraints: [],
validator: AtLeastOneFieldConstraint,
});
};
}
然后在你的类中使用这个自定义装饰器:
class MyEntity {
@AtLeastOneField()
field1?: string;
@AtLeastOneField()
field2?: string;
}
这样,你就可以确保field1
和field2
中至少有一个字段被填写了。