NestJS中使用class-validator验证字符串类型数字范围(100-5000)
在NestJS中验证字符串类型DTO属性的数字范围
要实现字符串类型属性必须是100到5000之间的数字,你可以结合class-validator和class-transformer的装饰器完成,以下是两种可行方案:
方案一:转换类型后使用内置验证器
这种方式先将字符串转为数字,再用内置范围验证器检查,直观且易于维护。
1. 安装依赖
如果未安装相关包,执行:
npm install class-validator class-transformer
2. 全局启用验证管道
在main.ts中配置ValidationPipe,开启自动类型转换:
import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ transform: true, // 启用自动类型转换 whitelist: true, // 过滤DTO未定义的属性 })); await app.listen(3000); } bootstrap();
3. 编写DTO验证逻辑
创建DTO类,通过@Transform将字符串转为数字,再用内置装饰器验证范围:
import { IsString, IsNumber, Min, Max, Transform } from 'class-validator'; import { TransformFnParams } from 'class-transformer'; export class YourDto { @IsString({ message: '该属性必须为字符串类型' }) // 将字符串转为数字,转换失败则保留原值,后续验证会报错 @Transform(({ value }: TransformFnParams) => { const num = Number(value); return isNaN(num) ? value : num; }) @IsNumber({ allowNaN: false }, { message: '该属性必须是可转换为数字的字符串' }) @Min(100, { message: '该属性最小值为100' }) @Max(5000, { message: '该属性最大值为5000' }) readonly targetProperty: string; }
方案二:自定义验证器(无需类型转换)
如果不需要转换属性类型,仅验证字符串形式的数字范围,可以自定义验证器:
1. 创建自定义验证器
新建custom-validators.ts文件:
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator'; export function IsStringNumberInRange(min: number, max: number, validationOptions?: ValidationOptions) { return function (object: Object, propertyName: string) { registerDecorator({ name: 'isStringNumberInRange', target: object.constructor, propertyName: propertyName, constraints: [min, max], options: validationOptions, validator: { validate(value: any, args: ValidationArguments) { const [min, max] = args.constraints; const num = Number(value); // 验证:是字符串、可转数字、在范围内 return typeof value === 'string' && !isNaN(num) && num >= min && num <= max; }, defaultMessage(args: ValidationArguments) { const [min, max] = args.constraints; return `${args.property}必须是字符串类型的数字,取值范围为${min}到${max}`; }, }, }); }; }
2. 在DTO中使用自定义验证器
import { IsString } from 'class-validator'; import { IsStringNumberInRange } from './custom-validators'; export class YourDto { @IsString({ message: '该属性必须为字符串类型' }) @IsStringNumberInRange(100, 5000) readonly targetProperty: string; }
两种方案都能满足需求,方案一更适合需要后续使用数字值的场景,方案二则保留原始字符串类型。
内容的提问来源于stack exchange,提问作者RJ amal
相关产品推荐
相关产品推荐

