在创建第一个管道时,我发现了一个问题,但无法检查元类型的类型。假设我有一个元类型-> [Function: MathEquationDTO]
,MathEquationDTO
是一个类。
在文档中,我可以看到它们正在通过创建诸如[String, Boolean, Number]
之类的函数数组,然后使用方法.includes()
在此数组中搜索元类型的类型来检查元类型的类型-我能做同样的事情还是可能有一个更好,更清晰的解决方案(函数数组看起来不太好)吗?
还有一个问题。我不知道如何验证和转换数据。接口PipeTransform<IN, OUT>
有两种类型:
所以我应该如何在控制器内部定义查询类型。如果将其设置为 IN 类型,那么我将无法访问 OUT 类型,或者这些类型的类型会有所不同吗?或者,也许我应该创建两个不同的管道,一个用于验证,另一个用于转换
管道
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException, Type } from '@nestjs/common';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';
import { MathEquationDTO } from '../math/dto/MathEquationDTO';
import { TMathEquation } from '../math/interface/TMathEquation';
@Injectable()
export class ValidationPipe implements PipeTransform<MathEquationDTO, Promise<TMathEquation>> {
async transform(value: any, { metatype }: ArgumentMetadata) {
console.log('METATYPE', metatype);
if (!this.toValidate(metatype)) {
throw new BadRequestException('Validation failed');
}
const object = plainToClass(metatype, value);
const errors = await validate(object);
if (errors.length > 0) {
throw new BadRequestException('Validation failed');
}
return {
value: value.value.map(stringValue => parseInt(stringValue, 10)),
};
}
private toValidate(metatype: Function): boolean {
const types: Function[] = [String, Boolean, Number, Array, Object];
return !types.includes(metatype);
}
}
控制器
import { Controller, Get, Query, UseFilters, UsePipes } from '@nestjs/common';
import { MathService } from './math.service';
import { MathExceptionFilter } from '../exceptions/filters/math-exception.filter';
import { MathEquationDTO } from './dto/MathEquationDTO';
import { ValidationPipe } from '../pipes/MathValidationPipe';
@Controller('math')
export class MathController {
constructor(private readonly appService: MathService) {}
@Get('add')
@UseFilters(new MathExceptionFilter())
@UsePipes(ValidationPipe)
addTwoNumbers(@Query() dataToCount: MathEquationDTO): number {
return this.appService.addTwoNumbers(dataToCount.value);
}
}
MathEquationDTO
import { IsString } from 'class-validator';
export class MathEquationDTO {
@IsString({
each: true,
})
readonly value: string[];
}
TMathEquation
export interface TMathEquation {
value: number[];
}