如何使用Nestjs验证枚举值数组
我觉得和的组合是我需要实现的,我很难将它们组合在一起 我有一个DTO,它包含一个如何使用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
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[];