我的簡化路由類似于
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并限制根呼叫的方法之一?
如果不是,我將為受限情況創建一條替代路線。
uj5u.com熱心網友回復:
您可以將中間件和后續路由包裝在他們自己的組中(強調我的):
// Group 沿當前路由
// 路徑添加一個新的 inline-Router,并為 inline-Route 添加一個新的中間件堆疊。
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)
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442996.html
