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

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

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

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

0 ответов

Другие вопросы по тегам