我去过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 没有“请求范围”? (不确定此处的术语)