COOL-ADMIN · 2023年7月26日 0

【cool-admin】接口参数校验Joi

创建校验类

import { Rule, RuleType } from '@midwayjs/validate';

export class SendVerifyCodeValidator {
  // 手机号
  @Rule(RuleType.string().label('手机号').length(11).required())
  phoneNum: string;
}

export class BindPhoneValidator {
  // 手机号
  @Rule(RuleType.string().label('手机号').length(11).required())
  phoneNum: string;
  // 验证码
  @Rule(RuleType.string().label('验证码').length(6).required())
  verifyCode: string;
}

在控制器上加上 @Validate() 即可

  /**
   * 绑定手机号
   */
  @Post('/bindPhoneNum')
  @Validate({
    errorStatus: httpCodeEnum.PARAMS_ERROR,
  })
  async bindPhoneNum(@Body() bindPhoneData: BindPhoneValidator) {
    // TODO 绑定...
    return this.ok(null);
  }

重点:自定义错误提示语

  // 验证码
  @Rule(
    RuleType.string().label('验证码').length(6).required().messages({
      'string.length': '{{#label}}位数错误',
      'string.empty': '验证码不能为空',
      'any.required': '验证码必填',
    })
  )
  verifyCode: string;

这么写 是不行的!!

需要在这里去定义

  @Post('/bindPhoneNum')
  @Validate({
    errorStatus: httpCodeEnum.PARAMS_ERROR,
    validationOptions: {
      messages: {
      'string.length': '{{#label}}位数错误',
      'string.empty': '{{#label}}不能为空',
      'any.required': '{{#label}}必填',
      },
    },
  })
  async bindPhoneNum(@Body() bindPhoneData: BindPhoneValidator)

但是这样会更改所有字段的对应异常提示
比如这个接口要校验手机号和验证码两个参数
当手机号校验11位未通过,会提示 手机号位数错误
当验证码校验6位未通过,会提示 验证码位数错误

如果需要自定义验证器 并 提示自定义的异常信息

  // 验证码校验规则
  @Rule(
    RuleType.string()
      .label('验证码')
      .required()
      .custom((value, helpers) => {
        const reg = /^\d{6}$/;
        if (reg.test(value)) {
          return value;
        }
        throw new Error('格式错误');
      })
  )
  verifyCode: string;

  // 控制器中校验装饰器
  @Validate({
    errorStatus: httpCodeEnum.PARAMS_ERROR,
    validationOptions: {
      messages: {
        'any.custom': '{{#label}}{{#error.message}}',
      },
    },
  })

  // 最终响应
  {"code":5001,"message":"\"验证码\"格式错误"}