1、在主入口新增
package mainimport ("flag""fmt""go/application/internal/config""go/application/internal/handler""go/application/internal/middleware""go/application/internal/svc"manage "go/pkg/manage""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/rest/httpx"
)var configFile = flag.String("f", "etc/service-api.yaml", "配置文件")func main() {flag.Parse()var c config.Config// 读取配置文件中的值,将其保存在c变量上 所以这一块传递的是地址conf.MustLoad(*configFile, &c)// 将全局配置保存在全局变量上config.GlobalConfig = c// 注册服务,传递服务配置server := rest.MustNewServer(c.RestConf)// 全局中间件 这儿主要用来捕获一下全局的异常,抛出给前端server.Use(middleware.WithMiddleware)// 停止服务defer server.Stop()// 为上下文赋值 将常用的方法绑定在上下文当中(redis、orm等等)ctx := svc.NewServiceContext(c)// 注册路由handler.RegisterHandlers(server, ctx)// 统一错误处理httpx.SetErrorHandler(manage.ErrHandler)fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)// 启动服务server.Start()
}
通过server.Use(middleware.WithMiddleware) 来注册一个全局中间件,接受一个函数
2、中间件函数体
package middlewareimport ("fmt"manage "go/pkg/manage""net/http"
)func WithMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {defer func() {if err := recover(); err != nil {fmt.Println("============这儿是全局连接处理的异常===============")fmt.Println(err)fmt.Println("============这儿是全局连接处理的异常===============")manage.SetWrite(w, r, 500, "服务器内部错误")}}()next(w, r)}
}
通过defer和recover来捕获全局异常,如果出现异常,给前端返回500、服务器内部错误,并输入错误信息
3、向前端返回错误信息函数
package manageimport ("encoding/json""net/http"
)func SetWrite(w http.ResponseWriter, r *http.Request, code int, msg string) {// 接口请求成功 200状态码w.WriteHeader(http.StatusOK)// 返回一个CodeError结构体/*type CodeError struct {Code int `json:"code"`Message string `json:"message"`}*/resp := CodeError{Code: code, Message: msg}// 转换成jsonjsonData, _ := json.Marshal(resp)// 设置相应格式w.Header().Set("Content-Type", "application/json")// 返回给前端结构体w.Write(jsonData)
}
搞定收工