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

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

將參數傳遞給 Negroni 中間件

將參數傳遞給 Negroni 中間件

Go
qq_遁去的一_1 2021-11-01 16:49:34
對我的應用程序的每個請求都應該使用一些中間件。使用 Negroni docs 我已經實現了它,如下所示:func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {  // do some stuff before  next(rw, r)}我在其他地方使用:n.Use(negroni.HandlerFunc(MyMiddleware))但是,中間件需要接收一個額外的參數,我不確定如何構建它。目前我只是將該值設置為全局變量以使其可用,但我確定有一種更優雅的方法?我希望能夠做這樣的事情:n.Use(negroni.HandlerFunc(MyMiddleware(val)))
查看完整描述

1 回答

?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

最好的方法是將您的中間件封裝為一個保存其狀態的結構,而不僅僅是一個無狀態函數。(您也可以將其包裝為閉包,但結構在 IMO 中更簡潔):


type MyMiddleware struct {

    someval string

}


func NewMyMiddleware(someval string) *MyMiddleware {

    return &MyMiddleware{

       someval: someval,

    }

}



func (m *MyMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {


    // Do Something with someval

    fmt.Println(m.someval)


    next(w, req)

}

并初始化它很簡單:


n.Use(NewMyMiddleware("foo"))

編輯:也許閉包實際上很簡單:


 someval := foo


 n.Use(negroni.HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {

   // Do Something with someval

   fmt.Println(someval)


   next(w, req)

}))

或者你可以有一個返回中間件函數的函數:


func NewMiddleware(someval string) negroni.HandlerFunc {

     return negroni.HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {

       // Do Something with someval

       fmt.Println(someval)


       next(w, req)

    })

}

進而


n.Use(NewMiddleware("foo"))


查看完整回答
反對 回復 2021-11-01
  • 1 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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