📜  使用 class-validator 包对电话号码进行自定义验证 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:36:26.910000             🧑  作者: Mango

使用 class-validator 包对电话号码进行自定义验证 - TypeScript

class-validator是一个基于decorators的验证器,可以帮助我们轻松地验证对象的属性和参数。在这篇文章中,我们将使用class-validator包来自定义验证电话号码。

安装和引入class-validator

在开始之前,我们需要安装class-validator。

npm install class-validator --save

在你的TypeScript中引入class-validator:

import { IsPhoneNumber } from 'class-validator';
创建DTO

我们使用DTO(Data Transfer Object)来在程序中表示数据。下面是一个简单的DTO。

class User {
  @IsPhoneNumber('id')
  phone: string;
}

在这个DTO中,我们使用class-validator来验证电话号码。@IsPhoneNumber('id')装饰器告诉class-validator验证这个电话号码并传递字符串'id'作为规则的参数。

创建自定义验证

现在,我们需要添加一个自定义验证器,用于验证电话号码。

import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator';
import PhoneNumber from 'awesome-phonenumber';

@ValidatorConstraint({ name: 'isPhoneNumber', async: false })
export class IsPhoneNumberConstraint implements ValidatorConstraintInterface {
  validate(propertyValue: string, args: ValidationArguments) {
    if (!propertyValue) {
      return false;
    }

    const phoneNumber = new PhoneNumber(propertyValue, args.constraints[0]);
    return phoneNumber.isValid();
  }

  defaultMessage(args: ValidationArguments) {
    return `${args.property} is not a valid phone number.`;
  }
}

在上面的代码中,我们创建了一个名为IsPhoneNumberConstraint的自定义验证器,用于验证电话号码是否有效。

validate()函数中,我们创建一个awesome-phonenumber对象,并传递电话号码及其国家/地区代码。然后,我们使用isValid()函数来验证电话号码是否有效。

defaultMessage()函数中,我们定义了一个默认的验证错误消息。这个消息将被class-validator在验证失败时返回。

将自定义验证器应用到DTO

现在,我们需要将自定义验证器应用到DTO中。

class User {
  @IsPhoneNumber('id', { message: 'Please enter a valid phone number for your country' })
  phone: string;
}

在上面的代码中,我们在@IsPhoneNumber()装饰器中传递了一个消息,当验证失败时,将在错误对象中返回。

完整示例

在下面的示例中,我们使用上面创建的自定义验证器来验证用户电话号码。

DTO
import { IsPhoneNumber } from 'class-validator';

class User {
  @IsPhoneNumber('id', { message: 'Please enter a valid phone number for your country' })
  phone: string;
}
自定义验证器
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator';
import PhoneNumber from 'awesome-phonenumber';

@ValidatorConstraint({ name: 'isPhoneNumber', async: false })
export class IsPhoneNumberConstraint implements ValidatorConstraintInterface {
  validate(propertyValue: string, args: ValidationArguments) {
    if (!propertyValue) {
      return false;
    }

    const phoneNumber = new PhoneNumber(propertyValue, args.constraints[0]);
    return phoneNumber.isValid();
  }

  defaultMessage(args: ValidationArguments) {
    return `${args.property} is not a valid phone number.`;
  }
}
使用自定义验证器
import { validate } from 'class-validator';
import { IsPhoneNumberConstraint } from './IsPhoneNumberConstraint';
import { User } from './User'

async function main() {
  const user = new User();
  user.phone = '+86-1234567890';

  const errors = await validate(user, {
    validationError: {
      target: false
    },
    constraints: [new IsPhoneNumberConstraint()],
  });

  if (errors.length > 0) {
    console.log(errors[0].constraints);
  } else {
    console.log('User is valid');
  }
}

main();

在上面的示例中,我们通过调用validate()函数来验证用户DTO。在constraints参数中,我们传递了我们自定义的验证器。

总结

在本文中,我们使用class-validator包创建了一个自定义验证器,用于验证电话号码。使用class-validator可以使验证过程变得非常方便和灵活。