第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

訪問沒有 http.Request 的上下文

訪問沒有 http.Request 的上下文

Go
GCT1015 2023-07-26 15:22:53
我X-Request-Id在context中間件中進行設(shè)置(如下所示),以便我可以在有*http.Request結(jié)構(gòu)的地方使用它 - 例如req.Context().Value(middleware.ReqIdKey)。但是,我的代碼庫中的某些地方無法訪問*http.Requeststruct,因此我無法使用contextfetch X-Request-Id。Go 有辦法還是我試圖做一些根本錯誤的事情?內(nèi)部/中間件/requestid.goX-Request-Id這是我設(shè)置in的中間件context。http.ListenAndServe(":8080", middleware.RequestId(SomeHandler))目前在我的“服務(wù)器”包中稱為。package middlewareimport (    "context"    "github.com/google/uuid"    "net/http")type val stringconst ReqIdKey val = "X-Request-Id"func RequestId(handler http.Handler) http.Handler {    return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {        val := req.Header.Get("X-Request-Id")        if val == "" {            val = uuid.New().String()        }        ctx1 := context.WithValue(req.Context(), ReqIdKey, val)        ctx2 := req.WithContext(ctx1)        handler.ServeHTTP(res, ctx2)    })}內(nèi)部/logger/logger.go這是我需要訪問context或只是X-Request-Id值的另一個包。順便說一句,調(diào)用logger.Config是在啟動服務(wù)器之前進行的。package loggerimport (    "github.com/sirupsen/logrus"    "os")var Log *logrus.Entryfunc Config() {    logrus.SetLevel(logrus.InfoLevel)    logrus.SetOutput(os.Stdout)    logrus.SetFormatter(&logrus.JSONFormatter{})    Log = logrus.WithFields(logrus.Fields{        "request_id": ..., // I need X-Request-Id value to go here so that all logs have it    })}
查看完整描述

2 回答

?
慕少森

TA貢獻2019條經(jīng)驗 獲得超9個贊

如果您有 http.Request,您可以訪問其中的上下文和值。如果您沒有請求但需要上下文:獲取上下文并將其作為顯式參數(shù)傳遞到您的調(diào)用樹(按照慣例,它是第一個參數(shù))。

(Go 中沒有魔法,任何沒有直接或間接傳遞到函數(shù)中的東西都不存在。)


查看完整回答
反對 回復(fù) 2023-07-26
?
慕俠2389804

TA貢獻1719條經(jīng)驗 獲得超6個贊

首先,您應(yīng)該將上下文傳遞到需要的地方。如果您的Config()函數(shù)中需要它,請將其傳遞到那里:


func Config(ctx context.Context) {

  /* ... * /

}

但是您可能會Config()在啟動時調(diào)用一次,而不是根據(jù)請求調(diào)用一次,這導(dǎo)致了我的第二點:


您不應(yīng)該將上下文或一般請求范圍的數(shù)據(jù)傳遞給配置函數(shù)。這完全是本末倒置。


相反,您應(yīng)該將記錄器傳遞到處理程序/中間件中,并讓它記錄請求數(shù)據(jù):


func handleSomePath(logger *logrus.Entry) http.Handler {

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        /* do something */

        logger.WithFields(logrus.Fields{

            "request_id": /* ... */

        })

    }

}


查看完整回答
反對 回復(fù) 2023-07-26
  • 2 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號