Канал проверки работает с одним типом значения, но не с несколькими типами одновременно - PullRequest
0 голосов
/ 11 июня 2019

Я создал 3 DTO, которые исходят из другого родительского DTO, а затем в контроллере я использую библиотеку валидатора классов для проверки данных, которые пользователь передает контроллеру.

parent.dto.ts

import { IsNotEmpty, IsString, IsDateString, IsMongoId } from 'class-validator';

export class Parent {
  @IsNotEmpty()
  @IsMongoId()
  platform: string;
  @IsNotEmpty()
  @IsString({ each: true })
  admins: string[];
  @IsDateString()
  purchaseDate: Date;
  @IsDateString()
  validFrom: Date;
  @IsDateString()
  validTo: Date;
}

a.dto.ts

import { IsMongoId, IsNotEmpty, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
import { Parent } from './parent.dto';

class A_options {
  @IsNotEmpty()
  @IsMongoId()
  dataA: string;
}

export class A extends Parent {
  @IsNotEmpty()
  testA: string;
  @ValidateNested()
  @Type(() => A_options)
  data: A_options;
} 

b.dto.ts

import { IsMongoId, IsNotEmpty, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
import { Parent } from './parent.dto';

class B_options {
  @IsNotEmpty()
  @IsMongoId()
  dataB: string;
}

export class B extends Parent {
  @IsNotEmpty()
  testB: string;
  @ValidateNested()
  @Type(() => B_options)
  data: B_options;
}

c.dto.ts

import { IsMongoId, IsNotEmpty, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
import { Parent } from './parent.dto';

class C_options {
  @IsNotEmpty()
  @IsMongoId()
  dataC: string;
}

export class C extends Parent {
  @IsNotEmpty()
  testC: string;
  @ValidateNested()
  @Type(() => C_options)
  data: C_options;
}  

А в контроллере я использую ValidationPipe параметр body: A

controller.ts

@UsePipes(ValidationPipe)
  @Post()
  async createItem(@Res() res, @Body() body: A) {
    const result = await this.createTest.createObject(body);
    return res.status(HttpStatus.OK).json({
      message: 'Item has been created successfully',
      newLicense,
    });
  }
} 

Это также работает с body: B и body: C

Но это не работает, когда я делаю body: A | B | C

Как я могу заставить его работать так, чтобы код был таким?

@UsePipes(ValidationPipe)
  @Post()
  async createItem(@Res() res, @Body() body: A | B | C) {
    const result = await this.createTest.createObject(body);
    return res.status(HttpStatus.OK).json({
      message: 'Item has been created successfully',
      newLicense,
    });
  }
}

1 Ответ

0 голосов
/ 11 июня 2019

В вашем случае я бы просто порекомендовал реализовать интерфейс IParent и расширить его до вашего Parent класса.

Тогда вы можете использовать IParent в вашем контроллере, например:

controller.ts

@UsePipes(ValidationPipe)
@Post()
async createItem(@Res() res, @Body() body: IParent) {
  const result = await this.createTest.createObject(body);
  return res.status(HttpStatus.OK).json({
    message: 'Item has been created successfully',
    newLicense,
  });
}

parent.interface.ts

export interface IParent {
  platform: string;
  admins: string[];
  purchaseDate: Date;
  validFrom: Date;
  validTo: Date;
}

parent.class.ts

import { IsNotEmpty, IsString, IsDateString, IsMongoId } from 'class-validator';

export class Parent implements IParent {
  @IsNotEmpty()
  @IsMongoId()
  platform: string;

  @IsNotEmpty()
  @IsString({ each: true })
  admins: string[];

  @IsDateString()
  purchaseDate: Date;

  @IsDateString()
  validFrom: Date;

  @IsDateString()
  validTo: Date;
}

Дайте мне знать, если это поможет; если да, подтвердите ответ, в противном случае предоставьте ссылку на хранилище с минимальным воспроизведением, чтобы мы могли помочь вам в дальнейшем.

...