在NestJS的class-validator中返回含字段名的错误信息方法问询
在NestJS的class-validator中返回含字段名的对象格式校验错误
当然可以实现,通过自定义异常过滤器或修改ValidationPipe的异常生成逻辑,就能将默认的数组格式错误信息转换为以字段名为键的对象格式,具体步骤如下:
方法一:自定义异常过滤器
- 创建异常过滤器文件
新建src/filters/validation.filter.ts,编写转换逻辑:
import { ExceptionFilter, Catch, ArgumentsHost, BadRequestException } from '@nestjs/common'; import { ValidationError } from 'class-validator'; @Catch(BadRequestException) export class ValidationExceptionFilter implements ExceptionFilter { catch(exception: BadRequestException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const status = exception.getStatus(); const exceptionResponse = exception.getResponse() as { message: ValidationError[] }; // 遍历错误数组,转换为字段-错误信息的对象 const errorMap = exceptionResponse.message.reduce((acc, error) => { if (error.constraints) { // 若字段有多个校验错误,这里取第一个;可根据需求调整为拼接所有错误 acc[error.property] = Object.values(error.constraints)[0]; } return acc; }, {} as Record<string, string>); response.status(status).json({ statusCode: status, message: errorMap, }); } }
- 注册过滤器
- 全局注册(在
main.ts中):
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationExceptionFilter } from './filters/validation.filter'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalFilters(new ValidationExceptionFilter()); await app.listen(3000); } bootstrap();
- 局部注册(在目标控制器或方法上):
import { Controller, UseFilters } from '@nestjs/common'; import { ValidationExceptionFilter } from '../filters/validation.filter'; @Controller('users') @UseFilters(ValidationExceptionFilter) export class UsersController { // 控制器逻辑 }
方法二:直接修改ValidationPipe的异常生成逻辑
如果不想单独写过滤器,也可以在配置ValidationPipe时,通过exceptionFactory直接转换错误格式:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; import { ValidationError } from 'class-validator'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true, exceptionFactory: (errors: ValidationError[]) => { const errorMap = errors.reduce((acc, error) => { if (error.constraints) { acc[error.property] = Object.values(error.constraints)[0]; } return acc; }, {} as Record<string, string>); return new BadRequestException(errorMap); }, })); await app.listen(3000); } bootstrap();
最终效果
完成配置后,当校验失败时,接口会返回如下格式的响应:
{ "statusCode": 400, "message": { "name": "Name is required", "username": "Username is required" } }
内容的提问来源于stack exchange,提问作者halcantara
相关产品推荐
相关产品推荐

