Почему совместное использование состояния через контекст работает только с моим промежуточным программным обеспечением запроса?
Я боролся с общим состоянием из некоторого промежуточного программного обеспечения.
Ранее в Golang я установил "структуру-обработчик" и использовал функции определения func (h handler) doSomething
поделиться этой информацией в этой структуре. Эта парадигма хорошо мне послужила, за исключением того, что она не работает в промежуточном программном обеспечении для мультиплексирования.
func (h handler) loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
logging := log.WithFields(log.Fields{"requestID": r.Header.Get("X-Request-Id")})
h.Log = logging
next.ServeHTTP(w, r)
})
}
Однако использование Context делает.
func (h handler) loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
logging := log.WithFields(log.Fields{"requestID": r.Header.Get("X-Request-Id")})
ctx := context.WithValue(r.Context(), logger, logging)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
Полный код можно найти по https://github.com/kaihendry/apex-request-id
Почему хоть? Неправильно ли я использовал этот подход обработчика для совместного использования состояния, и я должен вместо этого использовать контекст? Почему обработчик не "ограничивает запрос"? (не уверен в терминологии здесь)