我正在尝试使用 class-validator 验证请求如果它是数组。
输入来自查询参数 /api/items?someTypes=this
我的请求 dto 看起来像这样。
(...)
@IsArray()
@IsEnum(SOMETHING, {each: true})
readonly someTypes: keyof typeof SOMETHING[];
(...)
当我只给出一项时,@IsArray 给出验证错误,说它不是数组。
当一项来自查询参数时,我也想将其设置为数组,但我不知道如何操作。
我知道使用 /api/items?someTypes[]=this
将通过验证。
但我想知道是否有其他方法可以解决这个问题。
最佳答案
如果您的字段是一个数组,并且您想要对数组中的每个项目执行验证,则必须传递特殊的 each: true
@IsEnum()
的选项装饰器。
import { IsArray, IsEnum } from 'class-validator';
enum SomeType {
A,
B,
C,
}
class SearchQuery {
@IsArray()
@IsEnum(SomeType, { each: true })
types: SomeType[];
}
@Controller()
export class AppController {
@Get()
async search(@Query() searchQuery: SearchQuery): Promise<void>
{ ... }
}
然后,您可以使用以下语法向端点执行 GET 请求。
?types[]=A&types[]=B&types[]=C
当您只传递一项时,效果非常好。
?types[]=A
如果您不喜欢这种语法并且更喜欢 types=A,B,C
那么你可以组合class-validator
与 class-tranformer
.
class SearchQuery {
@IsArray()
@IsEnum(SomeType, { each: true })
@Transform(({ value }) =>
value
.trim()
.split(',')
.map((type) => SomeType[type]),
)
types: SomeType[];
}
关于typescript - 当单个项目来自查询参数时如何传递类验证器@isArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72921086/