我熟悉這樣的圍棋中間件模式:如何將Go中間件模式與錯誤返回請求處理程序結合使用?
// Pattern for writing HTTP middleware.
func middlewareHandler(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Our middleware logic goes here before executing application handler.
next.ServeHTTP(w, r)
// Our middleware logic goes here after executing application handler.
})
}
因此,舉例來說,如果我有一個loggingHandler:
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("Strated %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))
})
}
和一個簡單的handleFunc:
func handleFunc(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`Hello World!`))
}
我可以將它們組合如下:
http.Handle("/", loggingHandler(http.HandlerFunc(handleFunc)))
log.Fatal(http.ListenAndServe(":8080", nil))
沒關係。
但我喜歡Handlers能像普通函數那樣返回錯誤的想法。這使得錯誤處理更容易,因爲如果出現錯誤,我只能返回錯誤,或者只是在函數結束時返回nil。
我已經做了這樣的:
type errorHandler func(http.ResponseWriter, *http.Request) error
func (f errorHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
err := f(w, r)
if err != nil {
// log.Println(err)
fmt.Println(err)
os.Exit(1)
}
}
func errorHandle(w http.ResponseWriter, r *http.Request) error {
w.Write([]byte(`Hello World from errorHandle!`))
return nil
}
,然後用它通過包裝它像這樣:
http.Handle("/", errorHandler(errorHandle))
我可以讓這兩種模式獨立工作,但我不知道我怎麼能把它們結合起來。我喜歡我能夠將中間件與像愛麗絲這樣的庫鏈接起來。但如果他們也可以返回錯誤,那將會很好。我有辦法實現這一目標嗎?
所以你想要返回錯誤...在哪裏?誰將是檢查返回的錯誤的調用者? – zerkms