Gin-Gonic中间件声明

时间:2018-05-29 00:29:23

标签: go middleware

我正在使用Gin-Gonic,我正在创建一个自定义中间件。请参阅:https://github.com/gin-gonic/gin#custom-middleware

有没有理由说明文档中的中间件是这样编写的:

func MyMiddleware() gin.HandlerFunc {
    return func (c *gin.Context) {
        // middleware
    }
}
r := gin.New()
r.Use(MyMiddleware())

当我可以这样简单地写出来时:

func MyMiddleware(c *gin.Context) {
    // middleware
}
r := gin.New()
r.Use(MyMiddleware)

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

如果您愿意,您当然可以这样做:

func MyMiddleware(c *gin.Context) {
    // middleware
}
r := gin.New()
r.Use(MyMiddleware)

建议您这样做的最可能原因是:

func MyMiddleware() gin.HandlerFunc {
    return func (c *gin.Context) {
        // middleware
    }
}
r := gin.New()
r.Use(MyMiddleware())

是,所以你可以添加参数,这里使用的例子是:https://github.com/gin-gonic/gin#custom-middleware是一个记录中间件。:

func Logger() gin.HandlerFunc {
    return func(c *gin.Context) {
        // code goes here
    }
}

它没有任何参数,但您可以通过添加参数在中间件中使用logrus之类的自定义记录器:

您可以拥有这样的日志记录中间件:

func Logger(log *logrus.Logger) gin.HandlerFunc {
    return func(c *gin.Context) {
        // use logrus
        log.WithFields(log.Fields{
          "animal": "walrus",
        }).Info("A walrus appears")

    }
}

并像这样使用它:

var log = logrus.New()
r.Use(Logger(log))

答案 1 :(得分:1)

是的,你可以。

有时中间件需要参数。例如:

MyMiddleware(foo string) gin.HandlerFunc {

    // preprocess with argument foo

    return func(c *gin.Context) {
        // do something related with foo...
    }
}

gin.BasicAuthForRealm为例。在从HTTP请求检查授权之前,您必须为其提供auth数据。

func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc {
    // ...
}

对于没有参数的中间件,我认为他们只是想让它们保持相同的格式。

答案 2 :(得分:0)

返回函数的变量也可以允许中间件执行一些初始化,如果需要的话:

func MyMiddleware() gin.HandlerFunc {
    // Perform initialization here...
    return func (c *gin.Context) {
        // middleware
    }
}

r := gin.New()
r.Use(MyMiddleware())

该初始化仅执行一次(将中间件附加到请求时),而不是针对每个请求执行。

如果您正在编写需要初始化的中间件,但无法控制其他人的使用方式,则可能有用。