Gin自定义Error中间件

Gin自定义Error中间件

1、定义中间件

go 复制代码
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、接口处理函数中返回错误信息

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

go 复制代码
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,
	})
}