为了账号安全,请及时绑定邮箱和手机立即绑定

去驰中间件将项目添加到响应标头

去驰中间件将项目添加到响应标头

Go
慕容3067478 2022-09-12 20:16:18
我的概念很简单,我想添加请求ID(由chi生成到响应标头)。middleware.RequestID我下面的代码添加了但未添加ID本身。我不确定为什么,因为它肯定在上下文中可用,因为在中间件链中处于较高位置?X-Request-Idmiddleware.RequestID我的路由器创建:package restimport (    "time"    "github.com/go-chi/chi/v5"    "github.com/go-chi/chi/v5/middleware"    "goWebAPI/pkg/database"    "goWebAPI/pkg/rest/mw"    "goWebAPI/pkg/rest/routes")func GetRouter(db *database.Database) *chi.Mux {    r := chi.NewRouter()    r.Use(middleware.RequestID)    r.Use(mw.SendRequestID)    r.Use(middleware.RealIP)    r.Use(middleware.Logger)    r.Use(middleware.Recoverer)    r.Use(middleware.Timeout(60 * time.Second))    r.Get("/", routes.IndexRoute())    return r}我的自定义中间件:package mwimport (    "context"    "net/http"    "github.com/go-chi/chi/v5/middleware")const requestIDHeader = "X-Request-Id"func SendRequestID(next http.Handler) http.Handler {    fn := func(w http.ResponseWriter, r *http.Request) {        ctx := r.Context()        if w.Header().Get(requestIDHeader) == "" {            w.Header().Add(                requestIDHeader,                middleware.GetReqID(context.Background()),            )        }        next.ServeHTTP(w, r.WithContext(ctx))    }    return http.HandlerFunc(fn)}我的索引路由:package routesimport "net/http"func IndexRoute() http.HandlerFunc {    fn:= func(w http.ResponseWriter, r *http.Request) {        w.Write([]byte("welcome"))    }    return fn}
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

我相信你的问题在这里:

middleware.GetReqID(context.Background())

这将尝试获取新的空上下文的请求 ID,而您需要的是当前请求的请求 ID,这意味着它应该是

middleware.GetReqID(r.Context)

(或者,由于您已经在本地获取了请求上下文,因此也可以使用它。ctx

记录在获取请求Id中(强调我的):

如果存在请求 ID,则从给定的上下文中返回一个请求 ID。如果找不到请求 ID,则返回空字符串。


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号