当前位置: 首页 > news >正文

Gin自定义Error中间件

Gin自定义Error中间件

1、定义中间件

func ErrorHandler() gin.HandlerFunc {return func(c *gin.Context) {c.Next() // Step1: 执行接口处理函数// Step2: 检查是否存在错误	if len(c.Errors) > 0 {// Step3:  取最后的错误err := c.Errors.Last().Err// Step4: 返回一组错误消息c.JSON(http.StatusOK, map[string]any{"success":         false,"message": err.Error(),})}}
}	func main() {// 初始化数据库配置dbConfig := config.LoadConfig()// 初始化数据库连接err := repository.InitDB(dbConfig)if err != nil {fmt.Printf("数据库初始化失败: %v\n", err)return}fmt.Println("数据库连接成功!")// 初始化数据库表结构if err := repository.InitSchema(); err != nil {fmt.Printf("数据库表初始化失败: %v\n", err)return}fmt.Println("数据库表初始化成功!")// 创建 Gin 引擎r := gin.Default()// 全局中间件r.Use(ErrorHandler())// 加载路由router.SetupRoutes(r)
}

2、接口处理函数中返回错误信息

对于验证错误使用中间件统一处理(接口请求参数验证),对于业务逻辑错误直接处理(例如数据库操作)

type CreateUserRequest struct {Phone    string     `json:"phone" binding:"required"`Email    string     `json:"email" binding:"required,email"`Nickname string     `json:"nickname"`RealName string     `json:"realname"`Gender   string     `json:"gender" binding:"oneof=男 女"`Birth    *time.Time `json:"birth"`
}// CreateUser 创建新用户
func CreateUser(c *gin.Context) {// 定义接收参数的结构体var reqUser CreateUserRequest// 绑定并验证请求body参数if err := c.ShouldBindJSON(&reqUser); err != nil {c.Error(err) // 这会将错误添加到 c.Errors 中// c.JSON(http.StatusBadRequest, gin.H{// 	"status":     "error",// 	"message123": "请求参数错误",// })return}// 创建用户实体user := repository.User{Phone:    reqUser.Phone,Email:    reqUser.Email,Nickname: reqUser.Nickname,RealName: reqUser.RealName,Gender:   reqUser.Gender,// 其他字段...}// 保存到数据库db := repository.GetDB()if err := db.Create(&user).Error; err != nil {c.JSON(http.StatusInternalServerError, gin.H{"status":  "error","message": "创建用户失败: " + err.Error(),})return}// 返回成功响应c.JSON(http.StatusCreated, gin.H{"status":  "success","message": "用户创建成功","id":      user.ID,})
}
http://www.lryc.cn/news/626614.html

相关文章:

  • synchronized锁,ReentrantLock 锁
  • 路由器NAT的类型测定
  • ios八股文 -- Objective-c
  • 机器翻译 (Machine Translation) 经典面试笔试50题(包括详细答案)
  • 游戏本不插电源适配器不卡设置教程
  • 面试 TOP101 二分查找/排序专题题解汇总Java版(BM17 —— BM22)
  • TENON AI-AI大模型模拟面试官
  • keepalived简介
  • 阿里通义千问Qwen-Long 快速文档解析
  • 商城系统开发全解析:架构设计、功能模块与技术选型指南
  • Tumblr长文运营:亚矩阵云手机助力多账号轮询与关键词布局系统
  • AI一周事件(2025年8月13日-8月19日)
  • 手机 浏览器调用摄像头扫描二维码Quagga
  • 如何将数据从 iPhone 转移到 vivo?
  • 23种设计模式——构建器模式(Builder Pattern)详解
  • Jenkins服务器配置SSH
  • 【Ansible】变量、机密、事实
  • 云计算学习100天-第25天
  • ansible中roles角色是什么意思?
  • 苹果XR芯片介绍
  • 【JavaEE】多线程 -- 定时器
  • GO环境变量中GO111MODULE到底是干啥的?
  • 心路历程-了解网络相关知识
  • 【论文阅读】Multi-metrics adaptively identifies backdoors in Federated Learning
  • Azure 使用记录
  • mapbox高阶,结合threejs(threebox)添加建筑glb模型,添加阴影效果,设置阴影颜色和透明度
  • 通过try-catch判断数据库唯一键字段是否重复
  • linux的内核符号表
  • 【表的操作】
  • 深入理解 Linux 多线程