1、整体目录结构
1、全局处理主入口
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 {
// 如果err不为空的话,走错误处理函数,将err传递过去
ErrHandler(err)
} else {
// 没有错误信息,返回相应内容
httpx.OkJson(w, Body{
Code: OK.Code,
Message: OK.Message,
Result: resp,
})
}
}
2、统一错误处理主入口
package manage
import (
"net/http"
)
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,
}
}
// 自定义错误返回函数 错误函数主入口
func ErrHandler(err error) (int, interface{}) {
switch errorType := err.(type) {
// 如果错误类型为CodeError,就返回错误类型的结构体
case *CodeError:
return http.StatusOK, errorType.ErrorResponse()
default:
// 系统错误,500 错误提示
return http.StatusOK, CodeError{Code: 500, 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、非业务错误的再次封装,使用http.ResponseWriter进行返回给前端,常用在中间件中
package manage
import (
"encoding/json"
"net/http"
)
// codeError 接受统一返回格式,{code:int,message:string}
func SetWrite(w http.ResponseWriter, r *http.Request, codeError CodeError) {
// 接口请求成功 200状态码
w.WriteHeader(http.StatusOK)
// 转换成json
jsonData, _ := json.Marshal(codeError)
// 设置相应格式
w.Header().Set("Content-Type", "application/json")
// 返回给前端结构体
w.Write(jsonData)
}
5、修改路由Handler函数
func CreateMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req systemMenuType.MenuCreateType
if err := httpx.Parse(r, &req); err != nil {
manage.ResponseHandler(w, nil, err)
return
}
l := systemMenu.NewCreateMenuLogic(r.Context(), svcCtx)
resp, err := l.CreateMenu(&req)
if err != nil {
manage.ResponseHandler(w, nil, err)
} else {
manage.ResponseHandler(w, resp, nil)
}
}
}
httpx.OkJsonCtx和httpx.ErrorCtx() 替换为 manage.ResponseHandler
搞定收工