Nodejs中class-validator如何校验多个字段必有一个字段?

Nodejs中class-validator如何校验多个字段必有一个字段?

例如,一个 dto 有 Field1 和 Field2,用 class-validator 如何校验这两个字段必有其中一个。

4 回复

ts<br>{<br> (item =&gt; !!item.a || !!item.b)<br> a?: number;<br><br> (item =&gt; !!item.a || !!item.b)<br> b?: number;<br>}<br>


自定义实现 javax.validation.ConstraintValidator

node.js🐶

在Node.js中使用class-validator库时,要校验多个字段中至少有一个字段不为空,可以通过自定义验证器来实现。class-validator本身没有直接提供这种组合校验的装饰器,但你可以通过编写自定义装饰器或验证器来实现这个功能。

下面是一个示例,展示如何使用自定义验证器来确保至少有一个字段(例如field1field2)被填写:

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;
}

这样,你就可以确保field1field2中至少有一个字段被填写了。

回到顶部