1、整体目录结构
2、全局处理主入口
package manage
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
)
type Body struct {
Code int `json:"code"`
Message string `json:"message"`
Result interface{} `json:"data"`
}
// 统一返回入口,
func ResponseHandler(w http.ResponseWriter, resp interface{}, err error) {
if err != nil {
httpx.OkJson(w, ErrHandler(err))
// 如果err不为空的话,走错误处理函数,将err传递过去
} else {
// 没有错误信息,返回相应内容
httpx.OkJson(w, Body{
Code: OK.Code,
Message: OK.Message,
Result: resp,
})
}
}
2、统一错误处理主入口
package manage
type CodeError struct {
Code int `json:"code"`
Message string `json:"message"`
}
// 实现error的接口 然后CodeError继承一下Error方法 CodeError就为error类型的返回值
func (e *CodeError) Error() string {
return e.Message
}
// 返回给前端的数据
func (e *CodeError) ErrorResponse() CodeError {
return CodeError{
Code: e.Code,
Message: e.Message,
}
}
// 用来自定义抛出的异常,支持调用传递
func NewCodeError(code int, msg string) error {
return &CodeError{
Code: code,
Message: msg,
}
}
// 提供new方法,任意地方传递参数返回CodeError类型的数据
func New(code int, msg string) CodeError {
return CodeError{
Code: code,
Message: msg,
}
}
// 默认异常状态码函数,只需传递错误信息即可,默认返回code-10001
func DefaultErrHandler(message string) error {
return &CodeError{
Code: ServerError.Code,
Message: message,
}
}
// 自定义错误返回函数 错误函数主入口
func ErrHandler(err error) interface{} {
switch err.(type) {
// 如果错误类型为CodeError,就返回错误类型的结构体
case *CodeError:
return err
default:
// 系统错误,500 错误提示
return CodeError{Code: ServerError.Code, Message: err.Error()}
}
}
3、全局异常状态
package manage
var (
OK = New(0, "操作成功")
ReidsError = New(6379, "redis连接失败")
JwtError = New(500, "JWT解密失败")
TokenError = New(401, "Token已过期")
ServerError = New(500, "服务器内部错误")
)
4、修改路由Handler函数
package basics
import (
"go/application/internal/logic/basics"
"go/application/internal/svc"
basicsType "go/application/internal/types/basics"
manage "go/pkg/manage"
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
)
func LoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req basicsType.LoginReq
if err := httpx.Parse(r, &req); err != nil {
manage.ResponseHandler(w, nil, err)
return
}
l := basics.NewLoginLogic(r.Context(), svcCtx)
resp, err := l.Login(&req)
manage.ResponseHandler(w, resp, err)
}
}
httpx.OkJsonCtx和httpx.ErrorCtx() 替换为 manage.ResponseHandler
搞定收工