49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package middleware
|
|||
|
|
|
||
|
|
import (
|
||
|
|
stderrors "errors"
|
||
|
|
"net/http"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
|
||
|
|
"github.com/Tencent/WeKnora/internal/errors"
|
||
|
|
)
|
||
|
|
|
||
|
|
// ErrorHandler 是一个处理应用错误的中间件
|
||
|
|
func ErrorHandler() gin.HandlerFunc {
|
||
|
|
return func(c *gin.Context) {
|
||
|
|
// 处理请求
|
||
|
|
c.Next()
|
||
|
|
|
||
|
|
// 检查是否有错误
|
||
|
|
if len(c.Errors) > 0 && !c.Writer.Written() {
|
||
|
|
// 获取最后一个错误
|
||
|
|
err := c.Errors.Last().Err
|
||
|
|
|
||
|
|
// 检查是否为应用错误
|
||
|
|
var appErr *errors.AppError
|
||
|
|
if stderrors.As(err, &appErr) && appErr.HTTPCode >= 400 && appErr.HTTPCode <= 599 {
|
||
|
|
// 返回应用错误
|
||
|
|
c.JSON(appErr.HTTPCode, gin.H{
|
||
|
|
"success": false,
|
||
|
|
"error": gin.H{
|
||
|
|
"code": appErr.Code,
|
||
|
|
"message": appErr.Message,
|
||
|
|
"details": appErr.Details,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// 处理其他类型的错误
|
||
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
||
|
|
"success": false,
|
||
|
|
"error": gin.H{
|
||
|
|
"code": errors.ErrInternalServer,
|
||
|
|
"message": "Internal server error",
|
||
|
|
},
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|