66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
package web
|
||
|
||
import (
|
||
"encoding/json"
|
||
"errors"
|
||
"fmt"
|
||
"log/slog"
|
||
"platform/web/auth"
|
||
"platform/web/core"
|
||
"reflect"
|
||
|
||
"github.com/gofiber/fiber/v2"
|
||
)
|
||
|
||
func ErrorHandler(c *fiber.Ctx, err error) error {
|
||
|
||
var code = fiber.StatusInternalServerError
|
||
var message = "服务器异常"
|
||
|
||
var fiberErr *fiber.Error
|
||
var authErr auth.AuthErr
|
||
var bizErr *core.BizErr
|
||
var servErr *core.ServErr
|
||
var jsonErr *json.UnmarshalTypeError
|
||
|
||
switch {
|
||
|
||
// fiber 错误
|
||
case errors.As(err, &fiberErr):
|
||
code = fiberErr.Code
|
||
message = fiberErr.Message
|
||
|
||
// 认证授权错误
|
||
case errors.As(err, &authErr):
|
||
switch {
|
||
case errors.Is(err, auth.ErrAuthenticateUnauthorize):
|
||
code = fiber.StatusUnauthorized
|
||
case errors.Is(err, auth.ErrAuthenticateForbidden):
|
||
code = fiber.StatusForbidden
|
||
default:
|
||
code = fiber.StatusBadRequest
|
||
}
|
||
message = err.Error()
|
||
|
||
// 已处理的业务错误
|
||
case errors.As(err, &bizErr):
|
||
code = fiber.StatusBadRequest
|
||
message = err.Error()
|
||
|
||
case errors.As(err, &servErr):
|
||
code = fiber.StatusInternalServerError
|
||
message = err.Error()
|
||
|
||
case errors.As(err, &jsonErr):
|
||
code = fiber.StatusBadRequest
|
||
message = fmt.Sprintf("参数 %s 类型不正确,传入类型为 %s,正确类型应该为 %s", jsonErr.Field, jsonErr.Value, jsonErr.Type.Name())
|
||
|
||
// 所有未手动声明的错误类型
|
||
default:
|
||
slog.Warn("未处理的异常", slog.String("type", reflect.TypeOf(err).Name()), slog.String("error", err.Error()))
|
||
}
|
||
|
||
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
|
||
return c.Status(code).SendString(message)
|
||
}
|