开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
前言
自从出现 typeScript 之后就发现用 ts 写后端也是一模一样的的结果,从基本controller 到service 层层划分功能模块。主要还是依赖着 nest 框架。其中在入参校验使用class-validator 校验器,简直不要太方便。
class-validator 使用
- 先通过自定义一个全局的 pipe,validator- pipe,在项目启动时需要注册该pipe
- post 请求中所有的 body 参数都转成 class 对象。在 nest 框架中,可以通过注解的方式给参数字段加上校验规则
以 Controller body 参数的为例子,说下常用几种例子:
- IsOptional() 选填字段校验,如果是选填的,需要再加上另外校验
// namespace 是选填字段,如果有字段,值至少长度为1 ,
// MinLength(1) 用于非空传递,也可以使用 IsNotEmpty()
// 支持自定义错误信息
@IsOptional({message:"不是字符串"})
@MinLength(1)
namespace: string;
- @IsArray() 是数组类型
// 是数组类型,且数组长度最小为1
@ArrayMinSize(1)
@IsString({each:true})
codes: string[];
- @IsObject 是对象类型 。在项目尽量不用 any 而是具体到具体的数据类型,这样对数据校验才能更加更准确
// 对于键值对的类型直接使用
@IsObject()
value : KeyValuePair // 引用的是 common/types
- IsEnum 枚举类型
@IsEnum(targetType)
type: targetType;
- IsInt 类型。若是对于一些数字类型,可加上区间,不如分页最大数据量 limit 不能为负数。
@IsInt()
@Min(1)
limit : number
- 其他类型
@IsBoolean()检查值是布尔型
@IsDate()检查值是日期
@IsString()检查值是字符串
@IsNumber(options: IsNumberOptions)检查值是数字
@IsInt()检查值是整数
@IsArray()检查值是数组
@IsEnum(entity: object)检查值是有效枚举
高级用法
多条件限制,强制限制数据类型
@IsNumber()
@Min(1)
@Type(() => Number)
嵌套对象的校验,即用这个装饰器标记的对象/对象数组也将被验证。
@ValidateNested()
@Type(() => User)
还有很多用法,具体场景可以根据class-validator 的官方文档查看。