gin博客项目复盘--03错误处理、数据验证

128 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

错误处理

错误码标准化,接口返回错误代码,以供前端使用查看。

创建 /utils/errmsg/errmsg.go

package errmsg

const (
	SUCCSE = 200
	ERROR  = 500
  // code= 1000... 用户模块的错误
	ERROR_USERNAME_USED    = 1001
	ERROR_PASSWORD_WRONG   = 1002
  //...
)

var codemsg = map[int]string{
	SUCCSE: "ok",
	ERROR: "FAIL",
  ERROR_USERNAME_USED:    "用户名已存在!",
	ERROR_PASSWORD_WRONG:   "密码错误",
  //...
}

func GetErrMsg(code int) string {
	return codemsg[code]
}

使用

model/Article.go

api/v1/article.go

接口

  1. 创建各个模块的路由接口

  1. 维护到路由中

编写用户接口,实现初步验证+分页功能

以查询用户列表为例

api/v1/user.go

//查询用户列表
func GetUsers(c *gin.Context) {
	pageSize, _ := strconv.Atoi(c.Query("pagesize"))
	pageNum, _ := strconv.Atoi(c.Query("pagenum"))
	username := c.Query("username")

	switch {
	case pageSize >= 100:
		pageSize = 100
	case pageSize <= 0:
		pageSize = 10
	}

	if pageNum == 0 {
		pageNum = 1
	}

	data, total := model.GetUsers(username, pageSize, pageNum)
	code := errmsg.SUCCSE
	c.JSON(
		http.StatusOK, gin.H{
			"status":  code,
			"data":    data,
			"total":   total,
			"message": errmsg.GetErrMsg(code),
		},
	)
}

model/User.go

//GetUsers 查询用户列表
func GetUsers(username string, pageSize, pageNum int) ([]User, int64) {
	var users []User
	var total int64
	if username != "" {
		db.Select("id,username,role,created_at").Where(
			"username LIKE ?", username+"%",
		).Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users)

		db.Model(&users).Where(
			"username LIKE ?", username+"%",
		).Count(&total)
		return users, total
	}
	db.Select("id,username,role,created_at").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users)
	db.Model(&users).Count(&total)

	return users, total
}

后端数据验证

  • 使用 gin 框架内置包 validator
  • "github.com/go-playground/validator/v10"
  1. 在模型中的struct 加上数据验证的tag :validate

例如 model/Uesr.go 中:

type User struct {
	gorm.Model
	Username string `gorm:"type:varchar(20);not null " json:"username" validate:"required,min=4,max=12" label:"用户名"`
	Password string `gorm:"type:varchar(500);not null" json:"password" validate:"required,min=6,max=120" label:"密码"`
	Role     int    `gorm:"type:int;DEFAULT:2" json:"role" validate:"required,gte=2" label:"角色码"`
}
  1. 新建 utils/validator/validator.go
package validator

import (
	"fmt"
	"ginVue3blog/utils/errmsg"
  //注意需要引入如下4个包
	"github.com/go-playground/locales/zh_Hans_CN" //中文包
	unTrans "github.com/go-playground/universal-translator" //翻译包
	"github.com/go-playground/validator/v10"
	zhTrans "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
)

func Validate(data interface{}) (string, int) {
	validate := validator.New()
	uni := unTrans.New(zh_Hans_CN.New())
	trans, _ := uni.GetTranslator("zh_Hans_CN")

	err := zhTrans.RegisterDefaultTranslations(validate, trans)
	if err != nil {
		fmt.Println("err:", err)
	}
	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		label := field.Tag.Get("label")
		return label
	})
	err = validate.Struct(data)
	if err != nil {
		for _, v := range err.(validator.ValidationErrors) {
			return v.Translate(trans), errmsg.ERROR
		}
	}
	return "", errmsg.ERROR
}
  1. api/user.go 使用验证