# 介绍

我们经常要在方法调用时执行一些类型检查,参数转换的操作,Midway 提供了一种简单的能力来快速检查参数的类型,这个能力来源于 joi ,同时也提供了参数的转换能力,这个能力来自于 class-transformer 。 midway参数校验 (opens new window)

# 背景

最常用参数校验的地方是 控制器(Controller),同时你也可以在任意的 Class 中使用这个能力。

# 规则

一般放在名称为dto的文件夹下

import { Rule, RuleType } from "@midwayjs/decorator";

export class UserDTO {
  
  @Rule(RuleType.number().required())
  id: number;
  
  @Rule(RuleType.string().required())
  firstName: string;

  @Rule(RuleType.string().max(10))
  lastName: string;
  
  @Rule(RuleType.number().max(60))
  age: number;
}

# 常见规则

RuleType.number().required();               // 数字,必填
RuleType.number().max(10).min(1);           // 数字,最大值和最小值
RuleType.number().greater(10).less(50);     // 数字,大于 10,小于 50

RuleType.string().max(10).min(5);           // 字符串,长度最大 10,最小 5
RuleType.string().length(20);               // 字符串,长度 20
RuleType.string().pattern(/^[abc]+$/);      // 字符串,匹配正则格式

RuleType.object().length(5);                // 对象,key 数量等于 5


RuleType.array().items(RuleType.string());    // 数组,每个元素是字符串
RuleType.array().max(10);                   // 数组,最大长度为 10
RuleType.array().min(10);                   // 数组,最小长度为 10
RuleType.array().length(10);                // 数组,长度为 10

# 校验

在controller中指定校验

import { Controller, Get, Provide, ALL } from "@midwayjs/decorator";
import { UserDTO } from './dto/user';

@Provide()
@Controller('/api/user')
export class HomeController {

  @Post('/')
  @Validate()
  async updateUser(@Body(ALL) user: UserDTO ) {
    // user.id
  }
}

# 继承

body 校验的 DTO 支持继承

import { Rule, RuleType } from "@midwayjs/decorator";

export class CommonUserDTO {
  @Rule(RuleType.string().required())
  token: string;
  @Rule(RuleType.string())
  workId: string;
}

// 这里传入 CommonUserDTO 作为参数继承。相当于继承CommonUserDTO里面的参数校验规则
@Rule(CommonUserDTO)          
export class UserDTO extends CommonUserDTO {
  
  @Rule(RuleType.string().required())                 
  name: string;
}

# 级联

import { Rule, RuleType } from "@midwayjs/decorator";

export class SchoolDTO {
  @Rule(RuleType.string().required())
  name: string;
  @Rule(RuleType.string())
  address: string;
}

export class UserDTO {
  @Rule(RuleType.number().required())
  id: number;
  
  @Rule(RuleType.string().required())
  firstName: string;

  @Rule(RuleType.string().max(10))
  lastName: string;
  
  @Rule(SchoolDTO)                   // 这里传入 SchoolDTO 作为校验参数
  school: SchoolDTO;
}