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

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.xdnf.cn/news/18281.html

相关文章:

  • SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
  • 手机 浏览器调用摄像头扫描二维码Quagga
  • 2026 济南淀粉深加工展览会亮点:玉米科技与未来产业发展
  • 03-dockerfile
  • C++继承中的虚函数机制:从单继承到多继承的深度解析
  • 【ansible】2.实施ansible playbook
  • 机器学习算法核心总结
  • 静/动态库 IIC(arm) day58
  • 医疗问答应用:UniApp + Node.js + DeepSeek API
  • Objective-C 版本的 LiveEventBus 效果
  • 直流无刷(BLDC)电机、单相直流无刷电机、三相直流无刷电机、单相直流无刷电机驱动芯片
  • 齐次线性方程组最小二乘解
  • 从零开始学AI——13
  • Docker复杂安装--最详细的MySQL主从复制与Redis集群安装、主从复制、主从扩容主从缩容实战版
  • java线程池相关知识
  • XR(AR/VR/MR)芯片方案,Soc VS “MCU+协处理器”?
  • 【动态规划、dp】P4933 大师
  • pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。
  • C++之多态(从0到1的突破)
  • Python如何将两个列表转化为一个字典
  • 基于STM32的APP遥控视频水泵小车设计
  • Codeforces MIN = GCD
  • Python爬虫实战:研究dark-fantasy,构建奇幻文学数据采集分析系统
  • BM25 vs TF-IDF:经典文本检索方法的对比
  • 【39】OpenCV C++实战篇——直线拟合、直线测距、平行线段测距;(边缘检测,剔除噪点,轮廓检测,渐进概率霍夫直线)
  • Django管理后台结合剪映实现课件视频生成应用
  • MySQL架构
  • MySQL实战45讲 24-25
  • hadoop技术栈(九)Hbase替代方案
  • Linux 进程间通信(IPC):信号、共享内存