1 回答

TA貢獻1865條經驗 獲得超7個贊
看來您正在嘗試做兩件事。1 - 僅將中間件應用于您的一些請求處理程序。2 - 將數據從您的中間件傳遞到您的請求處理程序。
對于第一個,我可以想到三個選項。首先是您現在正在做的事情,有一個中間件函數,當您將處理程序函數傳遞給r.Handle. 偽代碼:
r.Handle("/path1", Mware(Handler1())).Methods("GET")
r.Handle("/path2", Mware(Handler2())).Methods("GET")
r.Handle("/path3-nomiddleware", Handler3()).Methods("GET")
您可以做的第二件事是將代碼添加到中間件以根據 URI 路徑進行過濾,然后使用r.Use. 偽代碼:
const mwarePaths []string = ...
func Mware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.RequestURI is in mwarePaths {
// do the middleware
}
}
}
r.Use(Mware)
第三,您可以將代碼放在直接在處理程序中調用的函數中,而不是像中間件一樣注冊它。偽代碼:
func myUtil(w http.ResponseWriter, r *http.Request){ ... }
func GetAssetsCompute(assetService ServiceType) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
myUtil(w, r)
// stuff here
})
}
第二件事——將數據從中間件傳遞到請求處理程序——這里有一些想法。
首先,如果你使用上面的常規函數、無中間件設置,這個問題就會消失,因為你在處理程序中需要的任何東西都可以只是你函數的返回值。
如果您確實使用中間件,您可以使用該context庫(也來自 gorilla)將變量綁定到 http.Request 實例以傳遞給您的處理程序:http ://www.gorillatoolkit.org/pkg/context 。使用它看起來像這樣:
import "github.com/gorilla/context"
func middleware(...) {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
context.Set(r, "myKey", "bar")
}
}
func handler(w http.ResponseWriter, r *http.Request) {
val, ok := context.GetOk(r, "myKey") // returns "bar", true
}
您選擇使用哪些選項取決于您(您知道自己的需求)。但是,正如評論中提到的,一個好的經驗法則是處理與請求處理程序所做的無關問題的代碼可以是中間件。處理與您的請求處理程序正在做什么直接相關的問題的代碼可以直接進入處理程序。
- 1 回答
- 0 關注
- 149 瀏覽
添加回答
舉報