NestJS中同时使用两个DTO类时嵌套校验错误消息不返回如何解决
嵌套DTO校验不返回错误修复方案
1. 开启ValidationPipe的transform配置
@Type()装饰器依赖class-transformer做类型转换,默认的ValidationPipe没有开启转换开关,导致嵌套的UpdateProgramScopeDto无法被正确实例化,内部的校验规则自然不会触发。
局部配置(仅当前接口生效)
修改接口的@Body参数配置:
@Post() async registerProgram( @Body(new ValidationPipe({ transform: true, whitelist: true, // 可选,自动过滤DTO未声明的字段 forbidNonWhitelisted: true, // 可选,传入未声明字段直接抛出错误 })) registerProgramDto: RegisterProgramDto, @User() user: AuthEntity, ) { return await this._programService.registerProgram( user.user_id, registerProgramDto, ); }
全局配置(所有接口生效)
在项目入口main.ts中配置全局ValidationPipe:
async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ transform: true // 必须开启才能支持嵌套DTO校验 // 其他配置按需添加 })) await app.listen(3000) } bootstrap()
2. 补充校验规则自定义消息(可选,方便排查问题)
给嵌套DTO的校验装饰器加上自定义错误提示,避免返回默认的英文报错:
export class UpdateProgramScopeDto { @Matches(scopeTypeRegex, { message: 'scopeType参数格式不符合要求' }) @ApiProperty({ type: String, description: 'scopeType', enum: SCOPE_TYPE, }) scopeType: SCOPE_TYPE; }
3. 依赖检查
如果上述配置后仍不生效,确认项目已正确安装class-validator和class-transformer两个依赖,且版本与当前NestJS版本兼容。
内容的提问来源于stack exchange,提问作者saman salehian
相关产品推荐
相关产品推荐

