如何使用Nestjs验证枚举值数组

如何使用Nestjs验证枚举值数组,nestjs,dto,Nestjs,Dto,我觉得和的组合是我需要实现的,我很难将它们组合在一起 我有一个DTO,它包含一个enum // create-order.dto.ts import { IsEmail, IsNotEmpty, IsEnum } from 'class-validator'; import { PurchasableType } from '../enum/purchaseable-type.enum'; export class CreateOrderDto { ... @IsNotE

我觉得和的组合是我需要实现的,我很难将它们组合在一起

我有一个DTO,它包含一个
enum

// create-order.dto.ts

import { IsEmail, IsNotEmpty, IsEnum } from 'class-validator';
import { PurchasableType } from '../enum/purchaseable-type.enum';

export class CreateOrderDto {

    ...

    @IsNotEmpty()
    @IsEnum(PurchasableType)
    readonly purchasableType: PurchasableType;
}

使用Postman,我发送了一个
purchableType
FOO
,并期望得到某种类型的错误。通过以上链接阅读,似乎整个过程相当复杂;这让我觉得我完全没有抓住重点

如何使用验证管道确保只允许
可购买类型.enum.ts
中的值

谢谢你的建议

//create-order.dto.ts
从“类验证器”导入{IsEmail,IsNotEmpty,IsEnum};
从“../enum/purchaseable-type.enum”导入{purchaseabletype};
导出类CreateOrderDto{
@IsNotEmpty()
只读用户标识:字符串;
@IsNotEmpty()
只读位置ID:字符串;
@IsNotEmpty()
@IsEnum(可购买类型)
只读purchasableType:purchasableType;
@IsNotEmpty()
@IsEmail()
只读电子邮件:字符串;
}
//purchasable-type.enum.ts
导出枚举PurchasableType{
诊所='诊所',
事件='EVENT',
LESSON='LESSON',
保留='保留',
团队='团队',
}
编辑

我似乎也没有正确定义实体,这可能是主要问题。我仍然好奇我的实现是否好/坏

//order.entity.ts
...
从“../enum/purchaseable-type.enum”导入{purchaseabletype};
@实体()
导出类顺序扩展BaseEntity{
@PrimaryGeneratedColumn()
id:编号;
@纵队({
类型:“枚举”,
枚举:PurchasableType,
})
现在,当我发送
foo
purchableType
时,我得到一个500错误。如果我发送
enum
中的任何有效值,我得到的是一个200/201

编辑2

当然,这里有一个更广阔的视野,我已经得到了。一切似乎都正常工作,我只是想有一个更好的了解到底发生了什么

// event.controller.ts

@Post('/:id/orders')
  async purchaseEventTickets(@Body() createOrderDto: CreateOrderDto): 
    Promise<Order> {
    return await this.eventService.purchaseEventTickets(createOrderDto);
  }

//event.service.ts
异步purchaseEventTickets(createOrderDto:createOrderDto):承诺{
...
return wait this.orderRepository.createOrder(createOrderDto);
}
//order.repository.ts
异步createOrder(createOrderDto:createOrderDto):承诺{
const{purchasableType}=createOrderDto;
const order=this.create();
order.purchableType=purchableType;
试一试{
等待订单。保存();
}捕获(错误){
this.logger.error(`未能创建顺序:${error.stack}`);
抛出新的InternalServerErrorException();
}
退货单;
}

使用Postman,如果我将无效的“Foo”值作为
PurchableType
发送,我将得到预期的错误。

以下是
创建dto的样子,其中包含
枚举

// create-order.dto.ts

import { IsEmail, IsNotEmpty, IsEnum } from 'class-validator';
import { PurchasableType } from '../enum/purchaseable-type.enum';

export class CreateOrderDto {

    ...

    @IsNotEmpty()
    @IsEnum(PurchasableType)
    readonly purchasableType: PurchasableType;
}

以下是枚举文件的外观:

// purchasable-type.enum.ts

export enum PurchasableType {
  CLINIC = 'CLINIC',
  EVENT = 'EVENT',
  LESSON = 'LESSON',
  RESERVATION = 'RESERVATION',
  TEAM = 'TEAM',
}

从这里,我可以自信地期望枚举的值是上述值之一。如果其他值通过,nest将抛出验证错误

此外,如果试图使用嵌套对象(或具有多个属性或数组的对象),则可以在DTO中执行以下操作:

import { PurchasableType } from '../interface/purchasable-type.interface';
...

@ApiProperty()
@IsArray()
@ArrayMinSize(7)
@ArrayMaxSize(7)
@ValidateNested({ each: true })
@Type(() => PurchasableType)
@IsNotEmpty()
readonly PurchasableType: PurchasableType[];

...


我花了一段时间才找到一个好的解决办法

@ApiProperty({
  description: 'List of enums',
  isArray: true,
  enum: MyEnum
})
@IsEnum(MyEnum, { each: true })
prop: MyEnum[];

你能提供更多关于你使用验证管道方式的信息吗?对我来说,500错误似乎是由ORM抛出的,而不是验证管道,这不是你所期望的。我猜肯定!我更新了我的问题。我希望我提供了更多的信息。谢谢你的帮助!
import { PurchasableType } from '../interface/purchasable-type.interface';
...

@ApiProperty()
@IsArray()
@ArrayMinSize(7)
@ArrayMaxSize(7)
@ValidateNested({ each: true })
@Type(() => PurchasableType)
@IsNotEmpty()
readonly PurchasableType: PurchasableType[];

...

@ApiProperty({
  description: 'List of enums',
  isArray: true,
  enum: MyEnum
})
@IsEnum(MyEnum, { each: true })
prop: MyEnum[];