diff --git a/router/config.go b/router/config.go new file mode 100644 index 0000000..57e6d89 --- /dev/null +++ b/router/config.go @@ -0,0 +1,25 @@ +// Package router ... +// +// Description : router ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-02-07 17:41 +package router + +import "strings" + +var defaultValidateErrTag = "err" + +// SetValidateErrTag 设置验证失败时, 获取错误信息的tag字段 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 17:42 2025/2/7 +func SetValidateErrTag(tagName string) { + tagName = strings.TrimSpace(tagName) + if tagName == "" { + return + } + defaultValidateErrTag = tagName +} diff --git a/router/handler.go b/router/handler.go index e76a410..ce791f3 100644 --- a/router/handler.go +++ b/router/handler.go @@ -31,6 +31,8 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { formData := reflect.New(uriCfg.FormDataType).Interface() // 表单解析 if err = request.Form.Parse(ctx, formData); nil != err { + // 格式化验证错误的信息 + err = GetValidateErr(formData, err) e = exception.NewFromError(400, err) response.SendWithException(ctx, e, nil) return diff --git a/router/register_test.go b/router/register_test.go index b19a439..6bbedd8 100644 --- a/router/register_test.go +++ b/router/register_test.go @@ -21,7 +21,7 @@ func (t TestController) Logic(ctx *gin.Context, formData *TestForm) (any, error) type TestForm struct { Meta `tag:"测试表单" path:"/a/b/c/d" desc:"测试接口" method:"get"` - Age int `json:"age" form:"age" binding:"min=20"` + Age int `json:"age" form:"age" binding:"min=20" err_msg:"年龄不能小于20"` Name string `json:"name" form:"name"` Test *Test `json:"test" form:"test"` Num *int64 `json:"num" form:"num"` @@ -31,6 +31,7 @@ type Test struct { } func Test_parseController(t *testing.T) { + SetValidateErrTag("err_msg") r := gin.Default() Group(r, "test", nil, TestController{}) r.Run(":8080") diff --git a/router/validator.go b/router/validator.go new file mode 100644 index 0000000..92602f0 --- /dev/null +++ b/router/validator.go @@ -0,0 +1,55 @@ +// Package router ... +// +// Description : router ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-02-07 17:36 +package router + +import ( + "errors" + "fmt" + "github.com/go-playground/validator/v10" + "reflect" + "strings" +) + +// GetValidateErr 格式化错误信息 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 22:19 2025/1/15 +func GetValidateErr(obj any, rawErr error) error { + if nil == rawErr { + return nil + } + if nil == obj { + return rawErr + } + var ( + ok bool + validationErrs validator.ValidationErrors + errString []string + field reflect.StructField + ) + if ok = errors.As(rawErr, &validationErrs); !ok { + return rawErr + } + objType := reflect.TypeOf(obj) + if objType.Kind() == reflect.Ptr { + objType = objType.Elem() + } + for _, validationErr := range validationErrs { + if field, ok = objType.FieldByName(validationErr.Field()); ok { + if e := field.Tag.Get(defaultValidateErrTag); e != "" { + errString = append(errString, fmt.Sprintf("%s: %s", field.Tag.Get("json"), e)) + continue + } else { + errString = append(errString, fmt.Sprintf("%s: %v", field.Tag.Get("json"), validationErr.Value())) + } + } + errString = append(errString, validationErr.Error()) + } + return errors.New(strings.Join(errString, "\n")) +}