Go/Gin调试输出-(x处理程序)的含义是什么

mbzjlibv  于 2023-01-22  发布在  Go
关注(0)|答案(1)|浏览(146)

在下面的Go/Gin调试输出中,(5个处理程序)的含义是什么?正如你所看到的,我显然有5个以上的处理程序。

[GIN-debug] GET    /                         --> .../handlers.APIDetail (5 handlers)
[GIN-debug] POST   /signup                   --> .../handlers.SignUp (5 handlers)
[GIN-debug] POST   /signin                   --> .../handlers.SignIn (5 handlers)
[GIN-debug] POST   /refresh-token            --> .../handlers.RefreshToken (5 handlers)
[GIN-debug] POST   /verify-email             --> .../handlers.VerifyEmailVerificationToken (5 handlers)
[GIN-debug] POST   /resend-verification-email --> .../handlers.ResendEmailVerificationEmail (5 handlers)
[GIN-debug] POST   /reset-password           --> .../handlers.ResetPassword (5 handlers)
[GIN-debug] POST   /change-password          --> .../handlers.ChangePassword (5 handlers)
[GIN-debug] PATCH  /users/me                 --> .../handlers.UpdateProfile (5 handlers)
[GIN-debug] POST   /signout                  --> .../handlers.SignOut (5 handlers)
[GIN-debug] GET    /orgs/:id                 --> .../handlers.GetOrganizations (5 handlers)
[GIN-debug] GET    /orgs                     --> .../handlers.GetOrganizations (5 handlers)
mnowg1ta

mnowg1ta1#

它应该是每个路由的处理程序链中的处理程序数量,即当请求被路由到某个端点时将执行的处理程序(包括中间件)的最大数量。
相关代码来自Gin来源@latest:

func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) {
    if IsDebugging() {
        nuHandlers := len(handlers)
        handlerName := nameOfFunction(handlers.Last())
        if DebugPrintRouteFunc == nil {
            debugPrint("%-6s %-25s --> %s (%d handlers)\n", httpMethod, absolutePath, handlerName, nuHandlers)
        } else {
            DebugPrintRouteFunc(httpMethod, absolutePath, handlerName, nuHandlers)
        }
    }
}

如果您在声明路由之前设置了一些全局中间件,例如使用router.Use,并且没有路由具有每个路由的中间件,这就解释了为什么数量总是相同的。
例如,请考虑以下内容:

r.Use(func(*gin.Context) { fmt.Println("FIRST") })
    r.GET("/foo", func(c *gin.Context) {
        c.Status(http.StatusOK)
    })

    r.Use(func(*gin.Context) { fmt.Println("SECOND") })
    r.GET("/bar", func(c *gin.Context) {
        c.Status(http.StatusOK)
    })

这将打印:

[GIN-debug] GET    /foo    --> main.main.func2 (2 handlers)
[GIN-debug] GET    /bar    --> main.main.func4 (3 handlers)

因为/foo的链具有FIRST中间件和处理程序本身(2),而/bar的链具有FIRSTSECOND中间件,加上处理程序本身(3)。

相关问题