NestJS中如何编写接收预定义字符串数组字段的DTO
解决方案
你需要使用 class-validator 提供的 @IsIn 装饰器实现数组元素范围校验,该装饰器可以指定允许的取值列表,搭配 each: true 参数即可对数组的每一项单独校验。
第一步:导入所需装饰器
首先从class-validator中导入IsIn装饰器,你已经在用的IsString、IsArray也来自该库,NestJS默认的校验能力就是基于class-validator实现的。
第二步:修改Product DTO代码
完整修改后的代码如下:
import { IsString, IsArray, IsIn } from 'class-validator'; // 预设合法值数组,如果定义在其他文件需要引入到当前DTO文件中 const validItems = ['a', 'b', 'c', 'd', 'e'] as const; export class Product { // 注意:你给出的合法示例中product_id是数字类型,如果实际需要数字类型,可以把@IsString改为@IsNumber或者@IsInt,字段类型也对应改为number @IsString({ message: 'Product id must be a string' }) product_id: string; @IsArray({ message: 'unit must be array' }) @IsString({ each: true, message: 'each unit must be a string' }) @IsIn(validItems, { each: true, message: `each unit must be one of: ${validItems.join(', ')}` }) units: string[]; }
规则说明
- 保留
@IsArray校验units字段本身是数组类型 - 保留
@IsString({each: true})校验数组每个元素都是字符串类型 - 新增的
@IsIn(validItems, {each: true})会逐个校验数组元素是否属于你预设的合法值列表,不符合规则就会抛出指定的错误信息。
相关文档说明
相关校验装饰器的用法可以参考class-validator官方文档的校验装饰器章节,NestJS的ValidationPipe默认集成class-validator,所有内置校验规则都基于该库提供的能力实现。
内容的提问来源于stack exchange,提问作者Riyad Zaigirdar
相关产品推荐
相关产品推荐

