如何从 NestJS 中的类验证器返回自定义响应

Kin*_*tic 3 javascript typescript class-validator nestjs

是否可以从 NestJs 内部的类验证器返回自定义错误响应。

NestJS 当前返回如下错误消息:

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": [
        {
            "target": {},
            "property": "username",
            "children": [],
            "constraints": {
                "maxLength": "username must be shorter than or equal to 20 characters",
                "minLength": "username must be longer than or equal to 4 characters",
                "isString": "username must be a string"
            }
        },
    ]
}
Run Code Online (Sandbox Code Playgroud)

然而,使用我的 API 的服务需要更类似于:

{
    "status": 400,
    "message": "Bad Request",
    "success": false,
    "meta": {
        "details": {
            "maxLength": "username must be shorter than or equal to 20 characters",
            "minLength": "username must be longer than or equal to 4 characters",
            "isString": "username must be a string"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

csa*_*int 7

Nestjs 具有名为Exception filters 的内置组件,如果您想在出现异常时装饰您的响应。您可以在此处找到相关文档。

以下代码段可能有助于编写您自己的过滤器。

<!-- language: lang-typescript -->
import { ExceptionFilter, Catch, ArgumentsHost, BadRequestException } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(BadRequestException)
export class BadRequestExceptionFilter implements ExceptionFilter {
  catch(exception: BadRequestException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();

    response
      .status(status)
      // you can manipulate the response here
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}
Run Code Online (Sandbox Code Playgroud)