go validator参数校验器自定义规则及提示(自定义异常返回提示语)

原文连接:https://segmentfault.com/a/1190000040445612
笔者针对参数为指针的情况做了一点小优化

这里我们用validator用来做参数校验,gin默认的github.com/go-playground/validator,可以直接使用

除此之外还有一些其他的工具也挺好用的,例如:

  • github.com/asaskevich/govalidator

这里笔者就使用gin默认的了

然后开始使用,我们可以用来校验结构体

type UserBasic struct {
    
    utils.ProcessErr(userParams, err)
    UserId        uint64 `gorm:"column:user_id" json:"userId"`
    UserNumber    string `gorm:"column:user_number" json:"userNumber"`
    Name          string `validate:"required" reg_error_info:"姓名不能为空"`
    Age           uint8  `validate:"lt=0|gt=150" reg_error_info:"年龄不合法"`
    PassWord      string `gorm:"column:password" json:"password"`
    PhoneNum      string `validate:"RegexPhone" reg_error_info:"手机号格式不正确"`
    Email         string `validate:"email" reg_error_info:"email为空或格式不正确"`
  ...其他省略
}

这时一般返回的错误是这样的

image-20230130225947389

当然这样不友好,我们希望能够返回自定义的提醒信息,我们封装一个方法即可

// ProcessErr go validator参数校验器自定义规则及提示
func ProcessErr(u interface{
    
    }, err error) string {
    
    
	if err == nil {
    
     //如果为nil 说明校验通过
		return ""
	}
	invalid, ok := err.(*validator.InvalidValidationError) //如果是输入参数无效,则直接返回输入参数错误
	if ok {
    
    
		return "输入参数错误:" + invalid.Error()
	}
	validationErrs := err.(validator.ValidationErrors) //断言是ValidationErrors
	for _, validationErr := range validationErrs {
    
    
		fieldName := validationErr.Field() //获取是哪个字段不符合格式
		typeOf := reflect.TypeOf(u)
		// 如果是指针,获取其属性
		if typeOf.Kind() == reflect.Ptr {
    
    
			typeOf = typeOf.Elem()
		}
		field, ok := typeOf.FieldByName(fieldName) //通过反射获取filed
		if ok {
    
    
			errorInfo := field.Tag.Get("reg_error_info") // 获取field对应的reg_error_info tag值
			return fieldName + ":" + errorInfo           // 返回错误
		} else {
    
    
			return "缺失reg_error_info"
		}
	}
	return ""
}

再调用我们的方法即可

// 参数校验
validate := validator.New()
// 自定义校验
validate.RegisterValidation("RegexPhone", utils.RegexPhone)
if err := validate.Struct(userParams); err != nil {
    
    
  // 返回我们tag中的提示语
  c.JSON(-1, response.Err.WithMsg(utils.ProcessErr(userParams, err)))
  return
}

现在就是我们想要的结果了

image-20230130230149986

猜你喜欢

转载自blog.csdn.net/fengxiandada/article/details/128810160
今日推荐