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

我的概念很简单,我想添加请求ID(由chi生成到响应标头)。middleware.RequestID


我下面的代码添加了但未添加ID本身。我不确定为什么,因为它肯定在上下文中可用,因为在中间件链中处于较高位置?X-Request-Idmiddleware.RequestID


我的路由器创建:


package rest


import (

    "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 mw


import (

    "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 routes


import "net/http"


func IndexRoute() http.HandlerFunc {

    fn:= func(w http.ResponseWriter, r *http.Request) {

        w.Write([]byte("welcome"))

    }

    return fn

}


慕容3067478
浏览 99回答 1
1回答

胡子哥哥

我相信你的问题在这里:middleware.GetReqID(context.Background())这将尝试获取新的空上下文的请求 ID,而您需要的是当前请求的请求 ID,这意味着它应该是:middleware.GetReqID(r.Context)(或者,由于您已经在本地获取了请求上下文,因此也可以使用它。ctx这记录在获取请求Id中(强调我的):如果存在请求 ID,则从给定的上下文中返回一个请求 ID。如果找不到请求 ID,则返回空字符串。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go