首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go chi中间件将项添加到响应头

Go chi中间件将项添加到响应头
EN

Stack Overflow用户
提问于 2021-07-09 17:22:29
回答 1查看 2K关注 0票数 0

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

下面的代码添加了X-Request-Id,但没有添加ID本身。我不知道为什么,因为它肯定可以在上下文中使用,因为middleware.RequestID在中间件链中处于更高的位置?

我的路由器创建:

代码语言:javascript
复制
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
}

我的定制中间件:

代码语言:javascript
复制
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)
}

我的索引路线:

代码语言:javascript
复制
package routes

import "net/http"

func IndexRoute() http.HandlerFunc {
    fn:= func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("welcome"))
    }
    return fn
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-09 17:54:58

我相信你的问题是:

代码语言:javascript
复制
middleware.GetReqID(context.Background())

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

代码语言:javascript
复制
middleware.GetReqID(r.Context)

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

这是documented in GetReqId (强调地雷):

如果存在

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68320666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档