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

2023-07-25  本文已影响0人  码码虎呼

创建校验类


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":"\"验证码\"格式错误"}

上一篇 下一篇

猜你喜欢

热点阅读