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

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

错误处理

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

创建 /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

image.png

api/v1/article.go

image.png

接口

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

image.png

  1. 维护到路由中

image.png

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

以查询用户列表为例

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 使用验证

image.png

相关文章
|
1月前
|
数据采集 C# 数据库
数据验证与错误处理:C#中的实践
【10月更文挑战第1天】在软件开发中,数据验证与错误处理至关重要,不仅能提升程序的健壮性和安全性,还能改善用户体验。本文从基础概念入手,详细介绍了C#中的数据验证方法,包括使用自定义属性和静态方法验证数据,以及常见的错误处理技巧,如Try-Catch-Finally结构和自定义异常。通过具体示例,帮助读者掌握最佳实践,构建高质量应用。
71 3
|
缓存 JSON Java
那些年,我们写过的无效单元测试
在这篇文章里,作者通过日常的单元测试实践,系统地总结出一套避免编写无效单元测试用例的方法和原则。
399 8
那些年,我们写过的无效单元测试
|
6月前
|
Go 开发者 UED
Go错误处理方式真的不好吗?
Go错误处理方式真的不好吗?
34 0
|
6月前
|
JSON Java 数据格式
SpringBoot - 错误处理机制与自定义错误处理实现
SpringBoot - 错误处理机制与自定义错误处理实现
48 0
|
前端开发
【React工作记录六十三】Http常见错误
【React工作记录六十三】Http常见错误
107 0
Yii2如何进行代码质量检查?底层原理是什么?
Yii2如何进行代码质量检查?底层原理是什么?
111 0
|
数据可视化
Yii2如何进行代码审查?具体怎么做?底层原理是什么?
Yii2如何进行代码审查?具体怎么做?底层原理是什么?
102 0
|
前端开发
#yyds干货盘点 【React工作记录十九】IE校验问题
#yyds干货盘点 【React工作记录十九】IE校验问题
75 0
|
JSON 前端开发 数据格式
#yyds干货盘点 【React工作记录十二】前端对接口参数错误如何解决
#yyds干货盘点 【React工作记录十二】前端对接口参数错误如何解决
169 0