2016-12-05 2 views
0

Я использую промежуточное ПО justinas/alice в Go, и я хочу передать аргументы функции, используемой в промежуточном программном обеспечении.Как передать параметры в промежуточное ПО alice в Go?

Например:

middlewareChain := alice.New(Func1(foo string,foo2 string)) 

Как я могу это сделать?

+2

вы не можете, в документе говорит, что функция middleware func должна иметь форму 'func (http.Handler) http.Handler', вы должны найти другой метод, такой как данные сеанса или другой механизм хранения. – Motakjuq

+1

Также хочу добавить, что использование контекста - это еще один вариант для этого, для чего он нужен. – saarrrr

ответ

1

Как уже упоминалось, Motakjuq, вы не можете напрямую написать промежуточное программное обеспечение, которое принимает параметры в качестве аргумента, поскольку они должны быть подписи func (http.Handler) http.Handler.

Что вы можете сделать, это создать функцию, которая генерирует вашу функцию промежуточного программного обеспечения.

func middlewareGenerator(foo, foo2 string) (mw func(http.Handler) http.Handler) { 

    mw = func(h http.Handler) http.Handler { 
     return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
      // Use foo1 & foo2 
      h.ServeHTTP(w, r) 
     }) 
    } 
    return 
} 

Затем вы можете сделать следующее

middlewareChain := alice.New(middlewareGenerator("foo","foo2"))

1

Может быть, я не понял ваш вопрос, если ваш PARAMS в Func1 изменения в каждом запросе, вы не можете передать аргументы в функция. Если функция требует некоторого Params, когда вы регистрируете его с Алисой, вы можете вернуть требуемую функцию, что-то вроде:

func Func1(foo, foo2, timeoutMessage string) alice.Constructor { 
    //... something to do with foo and foo2 
    return func(h http.Handler) http.Handler { 
     return http.TimeoutHandler(h, 1*time.Second, timeoutMessage) 
    } 
} 

И если вы хотите использовать его

chain := alice.New(Func1("", "", "time out")).... 
Смежные вопросы