Почему DTO не выдают ошибку проверки в гнезде js? - PullRequest
0 голосов
/ 06 апреля 2020

Я использую DTO в своем коде, и я получаю ответ, как и ожидалось, но в коде DTO не выдает ошибку, например

export class CreateCatDto {
  
  readonly name: string;
  readonly age: number;
  readonly breed: string;
  
}

В этом названии, возраст, порода является обязательным полем, и у каждого есть свой тип данных, но при работе на почтальоне, когда я не пропускаю все обязательные поля или только одно поле в теле почтальона. Я не получаю никаких ошибок, например, возраст требуется, если я пропустил два других поля или указал значение параметра не в соответствии с типом данных, например: - возраст: двадцать пять, тогда также должно выдать ошибку, но я Я не получаю.

Итак, этот класс создан для

import { ApiProperty } from '@nestjs/swagger';

export class Cat {

  @ApiProperty({ example: 'Kitty', description: 'The name of the Cat' })
  name: string;

  @ApiProperty({ example: 1, description: 'The age of the Cat' })
  age: number;

  @ApiProperty({
    example: 'Maine Coon',
    description: 'The breed of the Cat',
  })
  
  breed: string;
}

Это контроллер, в который я импортирую class и Dto.

import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import {
  ApiBearerAuth,
  ApiOperation,
  ApiResponse,
  ApiTags,
} from '@nestjs/swagger';

import { CatsService } from './cats.service';
import { Cat } from './classes/cat.class';
import { CreateCatDto } from './dto/create-cat.dto';

@ApiBearerAuth()
@ApiTags('cats')
@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()

  @ApiOperation({ summary: 'Create cat' })

  @ApiResponse({ status: 403, description: 'Forbidden.' })

  async create(@Body() createCatDto: CreateCatDto): Promise<Cat> {

    return this.catsService.create(createCatDto);
  }
}

1 Ответ

0 голосов
/ 07 апреля 2020

Я не знаю, почему вы выбрали гнездовой тег js -swagger, DTO сам по себе не будет проверять входные данные, возможно, вам нужно использовать ValidationPipe с пакетом class-validator, как предложено в документации https://docs.nestjs.com/techniques/validation#validation

Это так же просто, как добавить декоратор к вашему коду:

import { IsEmail, IsNotEmpty } from 'class-validator';

export class CreateCatDto {

  @IsNotEmpty()
  @IsString()
  readonly name: string;

  @IsNotEmpty()
  @IsInt()
  readonly age: number;

  @IsNotEmpty()
  readonly breed: string;

Вы можете увидеть все элементы здесь: https://github.com/typestack/class-validator#validation -декораторы

И если вы хотите очистить тело запроса, вы должны использовать сериализатор, чтобы помочь: https://docs.nestjs.com/techniques/serialization#serialization

Это покажет или скроет ваши свойства DTO на основе декораторов каждое поле. Вам необходимо установить пакет class-transformer.

import { Exclude } from 'class-transformer';

export class UserEntity {
  id: number;
  firstName: string;
  lastName: string;

  @Exclude()
  password: string;

  constructor(partial: Partial<UserEntity>) {
    Object.assign(this, partial);
  }
}

Важно помнить, что по вашему запросу и ответу будут работать перехватчики.

...