如何在NestJS的class-validator自定义消息中移除字段名前缀
解决方案
你遇到的前缀拼接逻辑不是class-validator本身输出的,是上层框架(比如NestJS默认的ValidationPipe)处理校验错误时,自动把嵌套字段的层级路径拼到消息前面导致的,你可以通过自定义错误处理逻辑去掉前缀,常用方案如下:
方案1:NestJS 场景重写ValidationPipe的异常工厂
如果你是搭配NestJS使用,只需要在全局注册ValidationPipe的时候重写exceptionFactory,递归提取你自定义的消息内容即可,不需要拼接字段路径:
import { ValidationPipe, BadRequestException } 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({ exceptionFactory: (validationErrors = []) => { const errorMessages: string[] = []; // 递归提取所有校验错误的自定义消息 const extractMessage = (errors: any[]) => { errors.forEach(error => { if (error.constraints) { Object.values(error.constraints).forEach(msg => errorMessages.push(msg as string)); } if (error.children?.length) { extractMessage(error.children); } }); }; extractMessage(validationErrors); return new BadRequestException(errorMessages); } })); await app.listen(3000); } bootstrap();
方案2:直接调用class-validator校验的场景
如果你是手动调用validate方法做校验,直接自己处理返回的ValidationError数组即可,不用拼接property字段路径:
import { validate } from 'class-validator'; async function validateDto(dto: any) { const errors = await validate(dto); const errorMessages: string[] = []; const extractMessage = (errors: any[]) => { errors.forEach(error => { if (error.constraints) { Object.values(error.constraints).forEach(msg => errorMessages.push(msg as string)); } if (error.children?.length) { extractMessage(error.children); } }); }; extractMessage(errors); return errorMessages; }
调整完成后返回的错误消息就只会保留你在message参数里写的内容,不会拼接任何字段前缀。
内容的提问来源于stack exchange,提问作者drake24
相关产品推荐
相关产品推荐

