You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NestJS的class-validator中返回含字段名的错误信息方法问询

在NestJS的class-validator中返回含字段名的对象格式校验错误

当然可以实现,通过自定义异常过滤器或修改ValidationPipe的异常生成逻辑,就能将默认的数组格式错误信息转换为以字段名为键的对象格式,具体步骤如下:

方法一:自定义异常过滤器

  1. 创建异常过滤器文件
    新建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,
    });
  }
}
  1. 注册过滤器
  • 全局注册(在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:40:25