Skip to content

参数校验

Vona 基于Zod 提供了非常简洁、灵活的机制对请求参数作校验

1. 自动推断Zod Schema:基础类型/Dto/Entity

如果参数类型是基础类型/Dto/Entity,那么,系统就会自动推断出对应的 Zod Schema,从而进行校验

比如,findOne(@Arg.query('id') id: number),id 的类型是number,那么自动推断出来的 Schema 就是:z.number()

再比如,findOne(@Arg.query() query: DtoStudentInfo),query 的类型是 Dto: DtoStudentInfo,那么自动推断出来的 Schema 就是:z.object({...})

  • 可自动推断的类型清单
名称说明
stringz.string()
numberz.number()
booleanz.boolean()
Dtoz.object({...})
Entityz.object({...})

2. 指定Zod Schema

我们还可以显式的指定 Zod Schema,从而提供更加复杂的校验规则。比如,URL 为/?id=1,我们要求 id 为number,并且>=6。那么,我们可以给 query 传入参数:z.number().min(6)

typescript
import z from 'zod';

class ControllerStudent3 {
  @Web.get()
  findOne(@Arg.query('id', z.number().min(6)) id: number) {}
}

3. 扩展Zod Schema的属性

我们还可以在现有的 Zod Schema 基础之上扩展新的属性

比如,我们要指定 id 为number,并且是可选,默认值为3

typescript
import { v } from 'vona-module-a-openapi';

class ControllerStudent3 {
  @Web.get()
  findOne(@Arg.query('id', v.default(3), v.optional()) id: number) {}
}

首先,系统自动推断出 schema 为z.number(),然后,依次附加optionaldefault属性,最终会生成 schema:z.number().optional().default(3)

因此,上述代码等价于:

typescript
class ControllerStudent3 {
  @Web.get()
  findOne(@Arg.query('id', z.number().optional().default(3)) id: number) {}
}

也等价于:

typescript
class ControllerStudent3 {
  @Web.get()
  findOne(@Arg.query('id', v.default(3), z.number().optional()) id: number) {}
}

4. 特殊工具:Array

对于 Array 类型的参数,Vona 也提供了便利的工具。比如,我们要求 ids 为number[]

typescript
class ControllerStudent3 {
  @Web.get()
  findOne(@Arg.query('ids', v.array(Number)) ids: number[]) {}
}

等价于:

typescript
class ControllerStudent3 {
  @Web.get()
  findOne(@Arg.query('ids', v.array(z.number())) ids: number[]) {}
}

再比如,我们从 Request body 获取 students 数组,类型为DtoStudentInfo[]

typescript
class ControllerStudent3 {
  @Web.post()
  update(@Arg.body('students', v.array(DtoStudentInfo)) students: DtoStudentInfo[]) {}
}

这些用于扩展 Zod Schema 的工具方法都放入分组v中,从而减轻心智负担

v工具清单

名称说明
@v.arrayarray
@v.defaultdefault
@v.objectobject
@v.optionaloptional
@v.emailemail
@v.urlurl
@v.uuiduuid
@v.ipip
@v.minmin
@v.maxmax
@v.tableIdentitytableIdentity
@v.openapiopenapi
@v.titletitle
@v.descriptiondescription
@v.exampleexample

基于 MIT 许可发布