如何制作中间件,使其只适用于某些处理程序(不是所有处理程序)? 例如,

func (srv *server) Router(repository storage.Repository, cfg config.Flags) *gin.Engine {
 h := handlers.NewHandlerProvider()
 m := middlewares.NewMiddlewareProvider()
 srv.httpServer.Use(gin.Recovery())
 srv.httpServer.Use(m.LogHTTPHandler())
 srv.httpServer.POST("/", FirstHandler)
 srv.httpServer.GET("/qwe", SecondHandler)
 return srv.httpServer
}

我只希望m.LogHTTPHandler()只与FirstHandler一起使用,而不是两者都使用

推荐答案

使用gin.RouterGroup对具有公共中间件的所有路由进行分组:

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
)

func main() {
    // New returns a new blank Engine instance without any middleware attached.
    router := gin.New()

    g1 := router.Group("/")
    {
        // Add the logger middleware to group 1.
        g1.Use(gin.Logger())

        g1.GET("/", gin.HandlerFunc(func(ctx *gin.Context) {
            fmt.Println("FirstHandler")
        }))
    }

    g2 := router.Group("/qwe")
    {
        g2.GET("/", gin.HandlerFunc(func(ctx *gin.Context) {
            fmt.Println("/SecondHandler")
        }))
    }

    router.Run(":8080")
}

Go相关问答推荐

无法在Macos上使用Azure Speech golang SDK

Go Net/http路由

CGO Linux到Windows交叉编译中的未知类型名称

使用Digitorus/pdfsign在GO(Golang)中签署pdf文件

如何在Golang中覆盖404

有没有办法让sqlc生成可以使用pgxpool的代码

如何测试 Zerolog 记录器引发类型错误的日志(log)事件?

是否可以在 hyperledger-chaincode 中使用 gRPC?如果可以,我如何避免在测试网络上调用时出错?

正确的 shell 程序进入 golang alpine docker 容器的入口点?

具有嵌套重复的正则表达式

枚举的 Golang 验证器自定义验证规则

接受通道和切片的通用函数

如何使用 go-playground/validator 编写 snake case 绑定标签?

如何通过组合来自不同包的接口来创建接口?

分配空切片而不引用其类型?

显示作为服务帐户身份验证的谷歌日历事件 - Golang App

在 Go 中将指针传递给函数的正确方法是什么,以便我可以读取和/或修改指针表示的值?

Go 使用 struct 作为接口而不实现所有方法

什么是无效字符实体 &ccb

处理程序中的无限循环