0

我在我的代码中使用 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;
}

这是我在其中导入类和 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);
  }
}

4

1 回答 1

2

我不知道你为什么选择nestjs-swagger标签,DTO本身不会验证输入,也许你需要按照文档https://docs.nestjs.com/techniques/中的建议使用带有class-validator包的ValidationPipe验证#验证

现在就像在您的代码上放置一个装饰器一样简单:

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-decorators

如果您想清理请求正文,您应该使用序列化程序来帮助: https ://docs.nestjs.com/techniques/serialization#serialization

这将根据每个字段的装饰器显示或隐藏您的 DTO 属性。您需要安装类变压器包。

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

重要的是要记住拦截器将根据您的请求和响应运行。

于 2020-04-07T02:27:14.097 回答