在阅读了官方的nestjs文档之后,我遇到了ValidationPipe
的以下实现:
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';
@Injectable()
export class ValidationPipe implements PipeTransform<any> {
async transform(value: any, { metatype }: ArgumentMetadata) {
if (!metatype || !this.toValidate(metatype)) {
return value;
}
const object = plainToClass(metatype, value);
const errors = await validate(object);
if (errors.length > 0) {
throw new BadRequestException('Validation failed');
}
return value;
}
private toValidate(metatype: Function): boolean {
const types: Function[] = [String, Boolean, Number, Array, Object];
return !types.includes(metatype);
}
}
我不了解transform
方法中的逻辑。如果有人能逐行解释这一点,那就太好了。我认为问题源于我不太了解ArgumentMetadata
是什么以及它来自哪里的事实。
答案 0 :(得分:0)
Metatype
是传递到管道中的对象的类类型,该对象通过反射和一些魔术方法but if you wanna look here's the code进行检索。
基本上,如果您有@Body() body: MyCustomClass
,则元类型将等于MyCustomClass
。这对于plainToClass
方法是必需的,因此它知道将JSON序列化到哪个类中。如果您使用JavaScript或不提供类型,则元类型将是未定义的