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

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

如何為特定路由使用中間件?

如何為特定路由使用中間件?

Go
MM們 2022-11-23 13:46:41
我的簡化路由類似于r.Route("/api/v1", func(r chi.Router) {        r.Route("/case", func(r chi.Router) {            // generic case - for everyone            r.Get("/{uuid}", caseGetByUuid)            r.Put("/", casePut)            // all cases only available to admins            // r.Use(ensureAdminUser)  // ← this is the place I have an error            r.Get("/", caseGetAll)        }        // admin endpoint        r.Route("/admin", func(r chi.Router) {            // ensure that the user is an admin            r.Use(ensureAdminUser)            r.Route("/user", func(r chi.Router) {                r.Route("/token", func(r chi.Router) { // /admin/user/token                    r.Get("/", userTokenGetAll)                    r.Put("/", userTokenCreate)                    r.Delete("/", userTokenDelete)                })            })        })    })第二條路線 ( /admin) 受中間件限制,如果不滿足特定約束,該中間件將打破鏈條。中間件位于所有路由之前。我想在第一條路線 ( /case) 中進行類似的過濾,但只針對一條路線(三條路線中的一條)。取消注釋r.Use(ensureAdminUser)導致panic: chi: all middlewares must be defined before routes on a mux我不能有兩條路線/case。有沒有辦法保留路由/case并限制 root 調用的方法之一?如果不是,我將為受限情況創建一條替代路線。
查看完整描述

1 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

您可以將中間件和后續路由包裝在它們自己的組中(強調我的):



// Group 在當前路由// 路徑上添加了一個新的內聯路由器,并為內聯路由提供了一個新的中間件堆棧。

Group(fn func(r Router)) Router


    r.Route("/api/v1", func(r chi.Router) {

        r.Route("/case", func(r chi.Router) {


            // generic case - for everyone

            r.Get("/{uuid}", caseGetByUuid)

            r.Put("/", casePut)


            // all cases only available to admins

            r.Group(func(r chi.Router) {

                r.Use(ensureAdminUser)

                r.Get("/", caseGetAll)

            })

        }

    })

它也可以與帶有r.Route.


當中間件僅應用于一個路由時,另一種選擇是r.With允許您“內聯”中間件:


r.Route("/api/v1", func(r chi.Router) {

    r.Route("/case", func(r chi.Router) {


        // generic case - for everyone

        r.Get("/{uuid}", caseGetByUuid)

        r.Put("/", casePut)


        // all cases only available to admins

        r.With(ensureAdminUser).Get("/", caseGetAll)

    }

})


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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