使用类验证器在 Nest js 中自定义错误消息

问题描述 投票:0回答:2

我正在开发一个 Nest 项目,并使用类验证器进行验证。

目前,如果有任何验证错误,我收到的错误响应为

{
    "statusCode": 400,
    "message": [
        "Title is too long. Maximal length is 50 characters, but actual is $value",
        "Title is too short. Minimal length is 10 characters, but actual is $value"
    ],
    "error": "Bad Request"
}

但是我们可以将消息作为对象数组,而不是字符串数组。因此,FE 可以轻松找出哪个字段出现错误,例如

{
    "message": [
        { "field": "title", "error": "Title is too long. Maximal length is 50 characters, but actual is $value" },
        { "field": "title", "error": "Title is too short. Minimal length is 10 characters, but actual is $value" }
    ]
}
validation nestjs class-validator
2个回答
14
投票

您可以在 NestJS 中使用异常过滤器来处理或添加自定义的用户友好响应。

但是,对于类验证器,通过在validationPipe中使用exceptionFactory()来修改类验证器返回的错误有相同的机制,这里是一个示例代码:

app.useGlobalPipes(
  new ValidationPipe({
    exceptionFactory: (validationErrors: ValidationError[] = []) => {
      return new BadRequestException(
        validationErrors.map((error) => ({
          field: error.property,
          error: Object.values(error.constraints).join(', '),
        })),
      );
    },
  }),
);

希望它对你有用!


0
投票

您可以实现与默认 ValidationPipe 类似的错误输出:

if (errors) {
  const errorMessages = [];
  errors.forEach((error) =>
    Object.entries(error.constraints).forEach((elt) =>
      errorMessages.push(elt[1]),
    ),
  );
  throw new BadRequestException(errorMessages);
}

输出如下所示:

    {
  "message": [
    "title should not be empty",
    "title must be a string",
    "ai_subject must be a string"
  ],
  "error": "Bad Request",
  "statusCode": 400
}
© www.soinside.com 2019 - 2024. All rights reserved.