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,})
}