Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gin-Gonic middleware declaration

I'm using Gin-Gonic and I'm creating a custom middleware. See: https://github.com/gin-gonic/gin#custom-middleware

Is there a reason why the middlewares in the doc are written as such:

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

When I could simply write it like this:

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

Thanks for your help!

like image 989
cHz Avatar asked May 29 '18 00:05

cHz


2 Answers

You can certainly just do this if you prefer it:

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

The most probably reason why it is suggested that you do this instead:

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

is, so you can add parameters, the example used in here: https://github.com/gin-gonic/gin#custom-middleware is a logging middleware.:

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

It didn't have any params, but you can use custom logger like logrus inside your middleware by adding a param:

You can have a logging middleware like this:

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

    }
}

And use it like this:

var log = logrus.New()
r.Use(Logger(log))
like image 174
stevenferrer Avatar answered Oct 18 '22 01:10

stevenferrer


Yes, you can.

Sometimes a middleware takes arguments. For example:

MyMiddleware(foo string) gin.HandlerFunc {

    // preprocess with argument foo

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

Take gin.BasicAuthForRealm for example. Before checking the authorization from HTTP requests, you must provide it the auth data.

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

For middlewares taking no argument, I think they just want to keep them in same format.

like image 39
Hunsin Avatar answered Oct 18 '22 01:10

Hunsin