NodeJS 验证管道中的Nestjs序列化不起作用

ycggw6v2  于 2023-11-17  发布在  Node.js
关注(0)|答案(1)|浏览(112)

我尝试使用@Expose作为下面类的属性的别名,但我得到的响应是camelCase。

import { Expose } from 'class-transformer';
import { BaseResponse } from './base-response.class';

export class ValidationResponse extends BaseResponse {
    @Expose({
        name: 'SomeField',
    })
    someField: string;

    @Expose({
        name: 'AnotherField',
    })
    anotherField= string;
}

字符串
我抛出了一个错误的请求错误,如下所示,在有效负载验证失败的情况下,来自验证管道的ValidationResponse如下所示。
错误的请求错误类

import { HttpException, HttpStatus } from '@nestjs/common';

    export class BadRequestError extends HttpException {
      constructor(response?: unknown) {
        super(response, HttpStatus.BAD_REQUEST);
      }
    }


自定义验证管道

import { ArgumentMetadata, Inject, PipeTransform, UseInterceptors, ClassSerializerInterceptor } from '@nestjs/common';
  import { plainToClass } from 'class-transformer';
  import { validate } from 'class-validator';
  import { BadRequestError } from '../exceptions/bad-request.exception';
  import { ErrorModel } from '../../common/classes/error-model.class';
  import { ErrorCode } from '../../common/enums/error.enum';
  import { ValidationResponse } from '../../common/classes/validation-response.class';
  import { REQUEST } from '@nestjs/core'
  import { CustomRequest } from 'src/common/classes/custom-request.class';

    @UseInterceptors(ClassSerializerInterceptor)
    export class CustomValidationPipe implements PipeTransform {
        constructor(@Inject(REQUEST) protected readonly request: CustomRequest) { }
    
        async transform(value: any, { metatype }: ArgumentMetadata) {
            const object = plainToClass(metatype, value);
            const errors = await validate(object, {
                forbidUnknownValues: false,
            });
            if (errors.length) {
                let errorResponse: ValidationResponse = new ValidationResponse();
                errorResponse.someField= 'somevalue';
                errorResponse.anotherField= 'anothervalue';
                throw new BadRequestError(errorResponse);
            }
            return value;
        }
    }


我在控制器中为POST API使用验证管道,如下所示

import { CustomValidationPipe } from 'custom-validation.pipe';

@UseInterceptors(ClassSerializerInterceptor)
export class SomeController {

@Post('test')
    @HttpCode(200)
    @ApiCreatedResponse({
        type: SomeResponse,
    })
    async someFunction(
        @Request()
        request,
        @Body(CustomValidationPipe)
        body: SomeRequest,
    ): Promise<SomeResponse> {
      // controller logic here
   }
}


使用@Expose,我试图将字段的大小写改为Pascal大小写,但当我从管道中获得响应时,它是 Camel 大小写,因为字段最初是在ValidationResponse类中定义的。也许我做错了什么。任何帮助都非常感谢。

bq9c1y66

bq9c1y661#

ClassSerializerInterceptor只对来自controller的 * 返回 * 值起作用,而不是错误/异常或任何thrown,至少默认情况下是这样。如果你想添加它,你必须扩展这个类,并为.catchError()添加一个方法,这样你就可以更容易地设置ValidationResponse类,让它拥有你想要的Pascal大小写字段,并设置在抛出异常时直接调用它们。
顺便说一下,@UseInterceptors()对pipe自定义管道类没有任何作用。它只影响这里的控制器,所以你可以摆脱它。

相关问题