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