Почему совместное использование состояния через контекст работает только с моим промежуточным программным обеспечением запроса? - PullRequest
0 голосов
/ 03 января 2019

Я боролся с общим состоянием из некоторого промежуточного программного обеспечения .

Ранее в 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

Почему ?Неправильно ли я использовал этот обработчик подход к общему состоянию, и я должен вместо этого использовать context ?Почему обработчик не обрабатывает запрос ?(не уверен в терминологии здесь)

...