亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何將上下文值從 Gin 中間件傳播到 gqlgen 解析器?

如何將上下文值從 Gin 中間件傳播到 gqlgen 解析器?

Go
達令說 2022-08-24 20:07:49
我正在嘗試提取令牌身份驗證中間件中的user_id,并將其傳遞給gqlgen的graphql解析器函數(以填充created_by并updated_by GraphQL模式的列)。身份驗證部分工作沒有問題。杜松子酒中間件:    var UID = "dummy"    func TokenAuthMiddleware() gin.HandlerFunc {        return func(c *gin.Context) {            err := auth.TokenValid(c.Request)            if err != nil {                c.JSON(http.StatusUnauthorized, "You need to be authorized to access this route")                c.Abort()                return            }            //            UID, _ = auth.ExtractTokenID(c.Request)            //c.Set("user_id", UID)                        c.Next()        }    }    func GetUID() string {        return UID    }graphql 解析器:    var ConstID = middleware.GetUID()        func (r *mutationResolver) CreateFarmer(ctx context.Context, input model.NewFarmer) (*model.Farmer, error) {        //Fetch Connection and close db        db := model.FetchConnection()        defer db.Close()            //var ConstID, _ = uuid.NewRandom()            log.Println(ctx)            farmer := model.Farmer{Name: input.Name, Surname: input.Surname, Dob: input.Dob, Fin: input.Fin, PlotLocLat: input.PlotLocLat, PlotLocLong: input.PlotLocLong, CreatedAt: time.Now(), UpdatedAt: time.Now(), CreatedBy: ConstID, UpdatedBy: ConstID}        db.Create(&farmer)        return &farmer, nil    }在這里,我嘗試使用全局變量UID來執行此操作,但是UID的值在中間件中沒有得到更新,因此,我在和列中獲得了“虛擬”值。我知道不鼓勵使用全局變量,我對其他想法持開放態度。謝謝CreatedByUpdatedBy
查看完整描述

1 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

使用 傳播值。context.Context


如果您使用的是 gqlgen,則必須記住傳遞給解析器函數的實例來自 (假設您按照 gqlgen 文檔中的建議設置了集成)。context.Context*http.Request


因此,使用Go-Gin,您應該能夠通過一些額外的管道來做到這一點:


func TokenAuthMiddleware() gin.HandlerFunc {

    return func(c *gin.Context) {

        UID := // ... get the UID somehow

        

        ctx := context.WithValue(c.Request.Context(), "user_id", UID)

        c.Request = c.Request.WithContext(ctx)

        c.Next()

    }

}

然后,您通常會在解析器中獲得該值:


func (r *mutationResolver) CreateFarmer(ctx context.Context, input model.NewFarmer) (*model.Farmer, error) {

    UID, _ := ctx.Value("user_id").(string)

    // ...

}

一個例子(雖然沒有杜松子酒)也可以在這里找到


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號