2015-08-26 2 views
3

Каждый запрос к моему приложению должен использовать некоторое промежуточное программное обеспечение. Используя документы NEGRONI я реализовал это так:Передача аргументов промежуточному программному обеспечению Negroni

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))) 

ответ

3

Лучше всего было бы, чтобы инкапсулировать промежуточное программное обеспечение как структура, которая держит свое состояние, а не только функции без гражданства. (Вы также можете обернуть его в качестве крышки, но структура чище 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")) 

EDIT: Возможно закрытие может быть на самом деле просто:

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")) 
+0

Хммм - кажется, излишним для меня - может прилипнуть с глобальной переменной, чтобы быть честным. – tommyd456

+1

@ tommyd456, пока вам не понадобится более одной переменной состояния, или вам потребуется более одного экземпляра вашего промежуточного программного обеспечения. Если это не так, то закрытия будет достаточно. Я добавлю это к своему ответу. –

+0

Мне нравится подход к закрытию - я дал это самому себе и был почти там. Приветствия за это. Собираюсь уходить утром! – tommyd456

Смежные вопросы