也许我不理解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;
}
例如,如果用户发送了 {},它会接受并返回所有内容吗?(这是我们不期望的)。有什么办法可以预防吗?
您可以创建自定义验证管道,如下所示:
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) {
//
}
}