📅  最后修改于: 2023-12-03 15:36:26.910000             🧑  作者: Mango
class-validator是一个基于decorators的验证器,可以帮助我们轻松地验证对象的属性和参数。在这篇文章中,我们将使用class-validator包来自定义验证电话号码。
在开始之前,我们需要安装class-validator。
npm install class-validator --save
在你的TypeScript中引入class-validator:
import { IsPhoneNumber } from 'class-validator';
我们使用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中。
class User {
@IsPhoneNumber('id', { message: 'Please enter a valid phone number for your country' })
phone: string;
}
在上面的代码中,我们在@IsPhoneNumber()
装饰器中传递了一个消息,当验证失败时,将在错误对象中返回。
在下面的示例中,我们使用上面创建的自定义验证器来验证用户电话号码。
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可以使验证过程变得非常方便和灵活。