2

在 Nest js dto 中,我想用多个国家的正则表达式验证用户手机号码。我怎样才能做到这一点?

@IsPhoneNumber('IN', {
    message: (args: ValidationArguments) => {
        if (args.value.length !== 10) {
            throw new BadRequestException(`${args.value} Wrong Phone Number`);
        } else {
            throw new InternalServerErrorException();
        }
    },
})
4

2 回答 2

0

不同的国家有不同的电话号码长度。我的建议是保留国家代码列表而不是自定义正则表达式。它更易于维护,并且更具可读性。所以解决方案是:

  1. 解析电话号码
  2. 如果它是有效的检查国家代码
  3. 如果它有效传递给下一个内置装饰器

所以我用libphonenumber-js创建了自己的装饰器

DTO 中的用法:

export class PhoneDto {
  @ToPhone
  @IsString({ message: 'must be a valid number' })
  readonly phone!: string;
}

执行:

import { Transform } from 'class-transformer';
import { parsePhoneNumberFromString } from 'libphonenumber-js';

const validCountries = ['US', 'UK'];

export const ToPhone = Transform(
  (value: any) => {
    if (typeof value !== 'string') return undefined;

    const parsed = parsePhoneNumberFromString(value);

    if (!parsed) return undefined;
    if (!validCountries.includes(parsed.country)) return undefined;

    return parsed.number;
  },
  { toClassOnly: true },
);

是的,这个解决方案增加了一个库,由于解析,它可能会更慢(实际上它取决于你的国家列表),但正如我之前所说,它更具可读性和可维护性。

于 2019-10-16T09:07:30.120 回答
0

@IsPhoneNumber(region: string)当前不支持将一组受限制的位置传递给。

您唯一的机会是将“ZZ”作为区域传递,这将强制用户使用 intl 输入数字。前缀(见文档

于 2020-04-08T11:03:17.557 回答