1、整体目录结构
2、全局处理主入口
package manageimport ("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 managetype 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 errdefault:// 系统错误,500 错误提示return CodeError{Code: ServerError.Code, Message: err.Error()}}
}
3、全局异常状态
package managevar (OK = New(0, "操作成功")ReidsError = New(6379, "redis连接失败")JwtError = New(500, "JWT解密失败")TokenError = New(401, "Token已过期")ServerError = New(500, "服务器内部错误")
)
4、修改路由Handler函数
package basicsimport ("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.LoginReqif 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
搞定收工