为什么通过上下文共享状态只能与我的请求中间件一起使用?

时间:2019-01-03 03:37:19

标签: go struct mux

我去过struggling with sharing state from some middleware

以前,我在Golang中设置了一个“处理程序结构”,并使用定义func (h handler) doSomething的函数在该结构中共享该信息。这种范例对我很有帮助,除了它不能在Mux请求中间件中使用。

  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上找到

为什么?我是否错误地使用了这种 handler 方法来共享状态,而应该使用 context 来代替?为什么 handler 没有“请求范围”? (不确定此处的术语)

0 个答案:

没有答案