亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go Gorilla Mux MiddlewareFunc with r.Use 并返回錯誤

Go Gorilla Mux MiddlewareFunc with r.Use 并返回錯誤

Go
浮云間 2023-06-05 13:30:00
您如何設置 Gorilla Mux r.Use 以在中間件鏈中返回錯誤?https://godoc.org/github.com/gorilla/mux#Router.Use主程序r := mux.NewRouter()r.Use(LoggingFunc)r.Use(AuthFunc)基礎中間件從日志記錄中間件開始,它可以從鏈的更下游捕獲和處理錯誤type HandlerFunc func(w http.ResponseWriter, r *http.Request) errorfunc LoggingFunc(next HandlerFunc) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        // Logging middleware        defer func() {            if err, ok := recover().(error); ok {                w.WriteHeader(http.StatusInternalServerError)            }        }()        err := next(w, r)        if err != nil {            // log error        }    })}下一個中間件處理身份驗證并將錯誤返回給日志記錄中間件。func AuthFunc(next HandlerFunc) HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) error {        if r.GET("JWT") == "" {            return fmt.Errorf("No JWT")        }        return next(w, r)    }}我不斷收到類似的錯誤  cannot use AuthFunc (type func(handlers.HandlerFunc) http.Handler) as type mux.MiddlewareFunc in argument to r.Use謝謝
查看完整描述

1 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

根據mux.Use 文檔,它的參數類型是MiddlewareFunc,返回類型不是http.Handler錯誤類型。您必須定義哪種返回類型http.HandlerFunc


type Middleware func(http.HandlerFunc) http.HandlerFunc


func main() {

? ? r := mux.NewRouter()


? ? //? execute middleware from right to left of the chain

? ? chain := Chain(SayHello, AuthFunc(), LoggingFunc())

? ? r.HandleFunc("/", chain)


? ? println("server listening :? 8000")

? ? http.ListenAndServe(":8000", r)

}


// Chain applies middlewares to a http.HandlerFunc

func Chain(f http.HandlerFunc, middlewares ...Middleware) http.HandlerFunc {

? ? for _, m := range middlewares {

? ? ? ? f = m(f)

? ? }

? ? return f

}


func LoggingFunc() Middleware {

? ? return func(next http.HandlerFunc) http.HandlerFunc {

? ? ? ? return func(w http.ResponseWriter, r *http.Request) {

? ? ? ? ? ? // Loggin middleware


? ? ? ? ? ? defer func() {

? ? ? ? ? ? ? ? if _, ok := recover().(error); ok {

? ? ? ? ? ? ? ? ? ? w.WriteHeader(http.StatusInternalServerError)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }()


? ? ? ? ? ? // Call next middleware/handler in chain

? ? ? ? ? ? next(w, r)

? ? ? ? }

? ? }

}


func AuthFunc() Middleware {

? ? return func(next http.HandlerFunc) http.HandlerFunc {

? ? ? ? return func(w http.ResponseWriter, r *http.Request) {


? ? ? ? ? ? if r.Header.Get("JWT") == "" {

? ? ? ? ? ? ? ? fmt.Errorf("No JWT")

? ? ? ? ? ? ? ? return

? ? ? ? ? ? }


? ? ? ? ? ? next(w, r)

? ? ? ? }

? ? }


}


func SayHello(w http.ResponseWriter, r *http.Request) {

? ? fmt.Fprintln(w, "Hello client")

}

在傳遞所有這些中間件后,它將執行LogginFuncthenAuthFunc和 then方法,這是您想要的方法。SayHello


查看完整回答
反對 回復 2023-06-05
  • 1 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號