前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gin博客项目复盘--03错误处理、数据验证

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

作者头像
微客鸟窝
发布2022-11-07 14:49:15
3440
发布2022-11-07 14:49:15
举报
文章被收录于专栏:Go语言指北

错误处理

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

创建 /utils/errmsg/errmsg.go

代码语言:javascript
复制
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

代码语言:javascript
复制
//查询用户列表
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

代码语言:javascript
复制
//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 中:

代码语言:javascript
复制
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
代码语言:javascript
复制
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 使用验证

图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 错误处理
    • 使用
    • 接口
    • 编写用户接口,实现初步验证+分页功能
      • 后端数据验证
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档