Когда я создавал свой первый канал, я обнаружил проблему, но не смог проверить тип metatype . Допустим, у меня есть метатип -> [Function: MathEquationDTO]
, MathEquationDTO
- это класс.
В документации я вижу, что они проверяют тип метатипа, создавая массив функций, таких как [String, Boolean, Number]
, а затем ищут тип метатипа в этом массиве с помощью метода .includes()
- могу ли я сделать то же самое или, может быть, тамлучшее и более понятное решение (массив функций выглядит не очень хорошо)?
Есть еще один вопрос. Я не знаю, как я могу проверить и преобразовать свои данные. Интерфейс PipeTransform<IN, OUT>
принимает два типа:
- IN -> тип, который идет внутрь трубы
- OUT -> тип, который долженreturn transform
Итак, как мне определить тип запроса внутри контроллера. Если я сделаю тип 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[];
}