Go 中的中间件隔离关注点并通过附加功能增强请求处理程序。传统的中间件模式涉及在主请求处理程序之前和之后执行处理程序。但是,它缺乏对错误处理的支持,这可能很麻烦。
为了解决这个问题,我们可以使用如下定义的错误处理请求处理程序:
type errorHandler func(http.ResponseWriter, *http.Request) error
这些处理程序允许我们直接返回错误,使错误处理更加直观。
为了将中间件模式与错误处理处理程序结合起来,我们引入了一个额外的中间件,作为链中的最后一步:
func errorHandler(h MyHandlerFunc) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := h(w, r) if err != nil { // Handle error here } }) }
这个中间件包装特殊类型的处理函数 MyHandlerFunc,它返回错误。
要使用此模式,请使用 errorHandler 中间件包装错误处理处理程序并将其添加到中间件链的末尾:
moreMiddleware(myMiddleware(errorHandler(myhandleFuncReturningError)))
考虑以下示例:
func loggingHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Before executing the handler. start := time.Now() log.Printf("Started %s %s", r.Method, r.URL.Path) next.ServeHTTP(w, r) // After executing the handler. log.Printf("Completed %s in %v", r.URL.Path, time.Since(start)) }) } func errorHandle(w http.ResponseWriter, r *http.Request) error { w.Write([]byte(`Hello World from errorHandle!`)) return nil } func main() { http.Handle("/", errorHandler(errorHandle)) log.Fatal(http.ListenAndServe(":8080", nil)) }
在在这个例子中,loggingHandler是一个传统的中间件,而errorHandle是一个错误处理请求处理程序。 errorHandler 中间件包装了 errorHandle 并确保正确处理错误。
以上是Go中间件如何有效处理请求处理程序返回的错误?的详细内容。更多信息请关注PHP中文网其他相关文章!