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中文網其他相關文章!