我尝试使用@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类中定义的。也许我做错了什么。任何帮助都非常感谢。
1条答案
按热度按时间bq9c1y661#
ClassSerializerInterceptor
只对来自controller
的 * 返回 * 值起作用,而不是错误/异常或任何thrown
,至少默认情况下是这样。如果你想添加它,你必须扩展这个类,并为.catchError()
添加一个方法,这样你就可以更容易地设置ValidationResponse
类,让它拥有你想要的Pascal大小写字段,并设置在抛出异常时直接调用它们。顺便说一下,
@UseInterceptors()
对pipe自定义管道类没有任何作用。它只影响这里的控制器,所以你可以摆脱它。