Как я могу проверить тип метатипа в Nest.js - PullRequest
0 голосов
/ 06 ноября 2019

Когда я создавал свой первый канал, я обнаружил проблему, но не смог проверить тип 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[];
}
...