如何更改 NestJS 控制器/类验证器错误消息的格式,显示每条消息属于哪个字段?

use*_*133 2 error-handling backend typescript class-validator nestjs

NestJS 控制器以及类验证器当前返回如下错误消息:

{
  statusCode: 422,
  message: [ 'Name is required', 'Email is required' ],
  error: 'Unprocessable Entity'
}
Run Code Online (Sandbox Code Playgroud)

但我想将每条消息绑定到其相关属性,如下所示:

{
  statusCode: 422,
  message: { name: 'Name is required', email: 'Email is required' },
  error: 'Unprocessable Entity'
}
Run Code Online (Sandbox Code Playgroud)

我的DTO:

import { IsNotEmpty } from 'class-validator';

export class CreateUserRequestDTO {
  @IsNotEmpty({ message: 'Name is required' })
  name: string;

  @IsNotEmpty({ message: 'Email is required' })
  email: string;
}
Run Code Online (Sandbox Code Playgroud)

我如何更改 NestJS 控制器/类验证器错误以返回这样的消息?

小智 6

exceptionFactory可以通过传递到 ValidationPipe 选项来修改验证错误的响应。

https://docs.nestjs.com/techniques/validation

请参阅示例实现:

app.useGlobalPipes(
  new ValidationPipe({
    exceptionFactory: (errors) => {
      return new UnprocessableEntityException({
        statusCode: 422,
        error: 'Unprocessable Entity',
        message: errors.reduce(
          (acc, e) => ({
            ...acc,
            [e.property]: Object.values(e.constraints),
          }),
          {},
        ),
      });
    },
  }),
);
Run Code Online (Sandbox Code Playgroud)