首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gin错误死机:通配符路由与现有子项冲突

Gin错误死机:通配符路由与现有子项冲突
EN

Stack Overflow用户
提问于 2019-12-03 06:19:23
回答 2查看 1.1K关注 0票数 2

我使用https://github.com/gin-gonic/gin,并尝试实现如下嵌套路由:

代码语言:javascript
运行
复制
// SetupRouter initialize routes and handlers
func SetupRouter() *gin.Engine {
    r := gin.Default()

    r.GET("/", controllers.Welcome)

    r.GET("/resources", controllers.GetResources)   
    r.GET("/resources/otherroute", controllers.GetOResources)   
    r.GET("/resources/:id", controllers.GetResourcesByID)   
    r.GET("/resources/:id/sub-resources", GetSubResources)
    r.GET("/resources/:id/sub-resources/:srid", GetSubResourcesByID)
    r.GET("/resources/:id/sub-resources/:srid/ssub-resources", GetSSubResources)
    r.GET("/resources/:id/sub-resources/:srid/ssub-resources/:ssrid", GetSSubResourcesByID)

    // .... etc.

    return r
}

但是我得到了一些奇怪的错误:

代码语言:javascript
运行
复制
[GIN-debug] GET    /                         --> github.com/badis/so-

gin-nested-routes/controllers.Welcome (3 handlers)
[GIN-debug] GET    /resources                --> github.com/badis/so-gin-nested-routes/controllers.GetResources (3 handlers)
[GIN-debug] GET    /resources/otherroute     --> github.com/badis/so-gin-nested-routes/controllers.GetOResources (3 handlers)
[GIN-debug] GET    /resources/:id            --> github.com/badis/so-gin-nested-routes/controllers.GetResourcesByID (3 handlers)
panic: wildcard route ':id' conflicts with existing children in path '/resources/:id'

goroutine 1 [running]:
github.com/gin-gonic/gin.(*node).insertChild(0xc0002516c0, 0xc0001edc01, 0xc0002325eb, 0x3, 0xc0002325e0, 0xe, 0xc000224300, 0x3, 0x3)
    /home/badis/go/src/github.com/gin-gonic/gin/tree.go:294 +0x807
github.com/gin-gonic/gin.(*node).addRoute(0xc0002516c0, 0xc0002325e0, 0xe, 0xc000224300, 0x3, 0x3)
    /home/badis/go/src/github.com/gin-gonic/gin/tree.go:255 +0x4ea

我不能找到一个令人满意的解决方案。

如果你想快速重现这个问题,看看这里:https://github.com/badis/so-question-gin-routes

EN

回答 2

Stack Overflow用户

发布于 2021-04-01 16:51:10

Gin不能区分/resources/otherroute/resources/:id,因为otherroute可以被解释为:id,因此会有冲突。

票数 0
EN

Stack Overflow用户

发布于 2021-09-13 07:00:46

试试这个:

代码语言:javascript
运行
复制
// SetupRouter initialize routes and handlers
func SetupRouter() *gin.Engine {
    r := gin.Default()

    r.GET("/", controllers.Welcome)

    r.GET("/resources", controllers.GetResources)   
    r.GET("/resources/otherroute", controllers.GetOResources)   
    resources := r.Group("/resources/:rid")
    {
        resources.GET("", controllers.GetResourcesByID)
        resources.GET("otherroute", controllers.GetOResources)
        resources.GET("sub-resources", controllers.GetSubResources)
        subResources := resources.GET("sub-resources/:srid")
        {
            subResources.GET("", GetSubResourcesByID)
            subResources.GET("/ssub-resources", GetSSubResources)
            subResources.GET("/ssub-resources/:ssrid", GetSSubResourcesByID)
        }
    }

    // .... etc.

    return r
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59147492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档