当前位置: 首页 > 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.dtcms.com/a/340703.html

相关文章:

  • 【C++】--指针与引用深入解析和对比
  • Gin传参和接收参数的方式
  • K8S-Secret资源对象
  • 如何代开VSCode的settigns.json文件
  • 【运维】githubvercel学习使用
  • 数据结构--2:ArrayList与顺序表
  • 【机器学习深度学习】AI大模型高并发挑战:用户负载部署策略
  • 26_基于深度学习的茶叶等级检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • 【JavaEE】多线程 -- CAS机制(比较并交换)
  • iPhone17系列超全准确预告
  • 【windows】只需两步繁杂的桌面开启清爽模式
  • 大数据常见问题分析与解决方案
  • 对抗式域适应 (Adversarial Domain Adaptation)
  • C++继承中的虚函数机制:从单继承到多继承的深度解析
  • VLN领域的“ImageNet”打造之路:从MP3D数据集、MP3D仿真器到Room-to-Room(R2R)、VLN-CE
  • Linux-文件查找find
  • pyqt 的自动滚动区QScrollArea
  • electron进程间通信-从主进程到渲染器进程
  • 康师傅2025上半年销售收入减少超11亿元,但净利润增长20.5%
  • qwen 千问大模型联网及json格式化输出
  • Https之(一)TLS介绍及握手过程详解
  • 【数据结构】排序算法全解析:概念与接口
  • 从0开始学习Java+AI知识点总结-20.web实战(多表查询)
  • HTTPS 原理
  • 模拟tomcat接收GET、POST请求
  • jvm三色标记
  • LLM常见名词记录
  • 《高中数学教与学》期刊简介
  • 109、【OS】【Nuttx】【周边】效果呈现方案解析:workspaceStorage(下)
  • Pytest项目_day20(log日志)