为了账号安全,请及时绑定邮箱和手机立即绑定

如何为特定路由使用中间件?

如何为特定路由使用中间件?

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 关注
  • 50 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信