Nestjs 装饰器检查至少一个属性被接受

问题描述 投票:0回答:1

也许我不理解DTO,但我希望它检查请求是否至少发送了一个属性。我该怎么办?

这是我的 dto:

//import libs
export class WorkspaceDto {
  @IsString()
  @IsNotEmpty()
  @Transform(({ value }) => value?.trim())
  @ApiProperty()
  @IsOptional()
  id?: string;

  @IsString()
  @IsNotEmpty()
  @Transform(({ value }) => value?.trim())
  @ApiProperty()
  @IsOptional()
  name?: string;

  @IsNotEmpty()
  @IsString()
  @Transform(({ value }) => value?.trim())
  @ApiProperty()
  @IsOptional()
  domain?: string;

  @IsNotEmpty()
  @IsString()
  @Transform(({ value }) => value?.trim())
  @IsOptional()
  @ApiProperty({ enum: WorkspaceStatusEnum, required: false })
  @IsEnum(WorkspaceStatusEnum)
  status?: WorkspaceStatusEnum;
}

例如,如果用户发送了 {},它会接受并返回所有内容吗?(这是我们不期望的)。有什么办法可以预防吗?

typescript nestjs decorator dto class-validator
1个回答
0
投票

您可以创建自定义验证管道,如下所示:

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';

@Injectable()
export class AtLeastOnePropertyPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    const keys = Object.keys(value);
    if (keys.length === 0) {
      throw new BadRequestException('At least one property must be provided');
    }
    return value;
  }
}

然后,你就可以在你的控制器中这样使用它了

import { Controller, Post, Body, UsePipes } from '@nestjs/common';

@Controller('your-endpoint')
export class WorkSpaceController {
  @Post()
  async filter(@Body(new UsePipes(AtLeastOnePropertyPipe)) workspaceDto: WorkspaceDto) {
    // 
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.