建简单网站,杭州商城型网站建设,山西官方网站有哪些,济南网站优化哪里做的好为什么需要实现自定义 recovery 中间件#xff1f;
在 Golang 的 Web 项目中#xff0c;自定义 recovery 中间件是一种常见的做法#xff0c;用于捕获并处理应用程序的运行时错误#xff0c;以避免整个应用程序崩溃并返回对应格式的响应数据。
很多三方 web 框架#xf…为什么需要实现自定义 recovery 中间件
在 Golang 的 Web 项目中自定义 recovery 中间件是一种常见的做法用于捕获并处理应用程序的运行时错误以避免整个应用程序崩溃并返回对应格式的响应数据。
很多三方 web 框架例如 gin、echo都提供了官方实现的 recovery 中间件但是官方实现的中间件并不一定能满足自己的需求。例如 gin 官方提供的 recovery 中间件发生 panic 后会将当前请求的标准状态码置为 500body 置为空。但是这样的返回数据与格式可能会和自己的项目要求不一致。例如项目发生 panic 后是要求标准状态码依然返回 200body 值为 {code:-1, data:nil,msg:xxx}这种场景下就需要实现自己的 recovery 中间件了。
如何实现自定义 recovery 中间件
如果使用 gin 框架的话就非常简单了因为 gin 提供了完善的中间件功能遵守 gin 的要求实现满足自己项目的功能就可以了简单示例代码如下
package mainimport (github.com/gin-gonic/ginlognet/httpruntime
)func Recovery() gin.HandlerFunc {return func(c *gin.Context) {defer func() {if err : recover(); err ! nil {const size 64 10stack : make([]byte, size)stack stack[:runtime.Stack(stack, false)]log.Printf([GinPanic] %s\n, string(stack))c.JSON(http.StatusOK, struct {Code int json:codeData interface{} json:dataMsg string json:msg}{Code: -1,Data: nil,Msg: server panic,})c.Abort()}}()c.Next()}
}
使用示例如下
package mainimport (github.com/gin-gonic/ginruntime
)func main() {r : gin.New()r.Use(Recovery())r.GET(/test, func(c *gin.Context) {panic(Oops! Something went wrong.)})r.Run(:8080)
}
运行起来后访问 /test 触发 panic 后返回了预期的结果如下
$ curl http://127.0.0.1:8080/test
{code:-1,data:null,msg:server panic}
接下来再看一个基于原生包 net/http 的一个示例代码如下
package mainimport (fmtlognet/httpruntime/debug
)// 自定义的recovery中间件
func recoveryMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {defer func() {if err : recover(); err ! nil {// 打印错误信息log.Println([Recovery] Panic:, err)// 打印堆栈跟踪信息log.Printf([Recovery] Stack Trace:\n%s\n, debug.Stack())// 返回一个适当的错误响应给客户端fmt.Fprintf(w, {code:-1,data:null,msg:server panic})}}()// 继续处理下一个中间件或路由处理函数next.ServeHTTP(w, r)})
}// 示例的处理函数
func helloHandler(w http.ResponseWriter, r *http.Request) {panic(Oops! Something went wrong.) // 模拟一个错误w.Write([]byte(Hello, Recovery Middleware!))
}func main() {// 创建一个多路复用器mux : http.NewServeMux()// 注册中间件mux.Handle(/test, recoveryMiddleware(http.HandlerFunc(helloHandler)))// 创建服务器server : http.Server{Addr: :8080,Handler: mux,}// 启动服务器log.Println(Server is running on http://localhost:8080)log.Fatal(server.ListenAndServe())
}
小结
Web 应用程序在运行时遇到错误并抛出 panic 时自定义的 recovery 中间件将会捕获panic 并记录对应的错误和堆栈信息避免应用程序崩溃并向客户端发送适当的错误响应数据。对于文本的示例可以根据自己的实际需求进行调整和扩展来实现自定义的 recovery 中间件。