NestJS中传入异类型值时DTO未返回错误的问题求助
解决NestJS DTO数字参数传入字符串不触发错误的问题
你当前的DTO只是普通TypeScript类,NestJS默认不会自动对参数做严格的类型验证和转换,所以字符串会被隐式处理而不触发错误。要解决这个问题,需要结合class-validator、class-transformer装饰器和全局验证管道的严格配置。
步骤1:配置全局ValidationPipe
在项目的main.ts中启用并配置验证管道,开启类型转换、白名单校验,并禁止隐式类型转换:
import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes( new ValidationPipe({ whitelist: true, // 自动移除DTO中未定义的属性 forbidNonWhitelisted: true, // 存在未定义属性时抛出错误 transform: true, // 自动将请求参数转换为DTO类实例 transformOptions: { enableImplicitConversion: false, // 禁止自动将字符串转数字等隐式转换 }, }), ); await app.listen(3000); } bootstrap();
步骤2:修改DTO添加验证与转换装饰器
给DTO的属性添加class-validator的验证装饰器,以及class-transformer的类型转换装饰器,确保参数类型符合要求:
import { IsNumber, IsOptional, IsString } from 'class-validator'; import { Type } from 'class-transformer'; // 假设DEFAULT_PAGINATION_LIMIT和DEFAULT_PAGE_NUMBER已提前定义 export class ListArticlesDto { @IsOptional() @IsString() search?: string = null; @IsOptional() @IsNumber({}, { message: 'limit必须是有效的数字' }) @Type(() => Number) // 指定将参数转换为Number类型 limit: number = DEFAULT_PAGINATION_LIMIT; @IsOptional() @IsNumber({}, { message: 'pageNumber必须是有效的数字' }) @Type(() => Number) pageNumber: number = DEFAULT_PAGE_NUMBER; }
配置完成后,当传入limit="jhsdja"这类无法转换为有效数字的字符串时,会触发400 Bad Request错误,返回自定义的验证提示信息。
内容的提问来源于stack exchange,提问作者Yogesh Rao
相关产品推荐
相关产品推荐

