feat: 参数校验,错误处理demo
continuous-integration/drone/push Build is passing Details

master
icechen 2022-01-13 02:23:00 +08:00
parent 2facdc9467
commit 372d70969b
3 changed files with 91 additions and 4 deletions

View File

@ -0,0 +1,27 @@
package user
import "github.com/gofiber/fiber/v2"
var ErrorUser = fiber.NewError(0, "错误")
func NewError(msg string) error {
return fiber.NewError(fiber.StatusInternalServerError, msg)
}
func NewErrorWithCode(code int, msg string) error {
return fiber.NewError(code, msg)
}
func WarpError(err error) error {
if err == nil {
return nil
}
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
func WarpErrorWithCode(code int, err error) error {
if err == nil {
return nil
}
return fiber.NewError(code, err.Error())
}

View File

@ -8,13 +8,12 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
var ErrorUser = fiber.NewError(0, "错误")
func LoginHandle(c *fiber.Ctx) error { func LoginHandle(c *fiber.Ctx) error {
var p = struct { var p = struct {
Code string `json:"code"` Code string `json:"code" validate:"required"`
Email string `json:"email" validate:"email"`
}{} }{}
err := c.BodyParser(&p) err := Bind(c, &p)
if err != nil { if err != nil {
return err return err
} }

View File

@ -0,0 +1,61 @@
package user
import (
"fmt"
"github.com/go-playground/locales/zh_Hans_CN"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zh_translations "github.com/go-playground/validator/v10/translations/zh"
"github.com/gofiber/fiber/v2"
"reflect"
"strings"
)
var Validate *validator.Validate
var trans ut.Translator
func init() {
Validate = validator.New()
zh := zh_Hans_CN.New()
uni := ut.New(zh, zh)
var ok bool
trans, ok = uni.GetTranslator("zh_Hans_CN")
if !ok {
panic(fmt.Errorf("uni.GetTranslator(%s) failed", "zh"))
}
Validate.RegisterTagNameFunc(func(field reflect.StructField) string {
label := field.Tag.Get("json")
if label == "" {
return field.Name
}
return label
})
err := zh_translations.RegisterDefaultTranslations(Validate, trans)
if err != nil {
panic(err)
}
}
func Bind(c *fiber.Ctx, out interface{}) error {
if reflect.TypeOf(out).Kind() != reflect.Ptr {
return NewError("bind must ptr")
}
if err := c.BodyParser(out); err != nil {
return WarpError(err)
}
err := Validate.Struct(out)
if err != nil {
if errs, ok := err.(validator.ValidationErrors); ok {
errString := make([]string, 0, len(errs))
for _, fieldError := range errs.Translate(trans) {
errString = append(errString, fieldError)
}
err = fmt.Errorf("%s", strings.Join(errString, ","))
}
return WarpErrorWithCode(fiber.StatusBadRequest, err)
}
return nil
}