go-zero 全局异常处理-全局中间件

1、在主入口新增

package main

import (
	"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 middleware

import (
	"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 manage

import (
	"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}
	// 转换成json
	jsonData, _ := json.Marshal(resp)
	// 设置相应格式
	w.Header().Set("Content-Type", "application/json")
	// 返回给前端结构体
	w.Write(jsonData)
}

搞定收工

你可能感兴趣的:(golang,中间件,开发语言)