Почему DTO не выдают ошибку проверки в nestjs?

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

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

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

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

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;
}

Это контроллер, в который я импортирую класс и 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 ответ

Я не знаю, почему вы выбрали тег nestjs-swagger, DTO сам по себе не будет проверять входные данные, возможно, вам нужно использовать ValidationPipe с пакетом class-validator, как это предлагается в документах https://docs.nestjs.com/techniques/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

И если вы хотите очистить тело запроса, вам следует использовать сериализатор, чтобы помочь: https://docs.nestjs.com/techniques/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);
  }
}

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

Другие вопросы по тегам