私はこのようなゴー・ミドルウェア・パターンを熟知しています: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))
これはすべて問題ありません。
しかし、私はハンドラが通常の機能のようにエラーを返すという考えが好きです。これは、エラーがあった場合にエラーを返すことができるだけでなく、関数の最後に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
}
そして、このようにそれをラップすることにより、それを使用する:私は、これら2つのパターンが個別に動作しますが、私は知らないことができます
http.Handle("/", errorHandler(errorHandle))
どのように私はそれらを組み合わせることができます。私はミドルウェアをアリスのような図書館と連鎖させることができるのが好きです。しかし、エラーを返すことができればいいと思う。これを達成する方法はありますか?
だから、エラーを返そうとしています...どこですか?返されたエラーをチェックする呼び出し元は誰ですか? – zerkms