You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:05