【发布时间】:2020-09-19 20:38:16
【问题描述】:
给定:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/status", handler)
r.Run(":8080")
}
func handler(c *gin.Context) {
var status string
if err := c.ShouldBindJSON(&status); err != nil {
c.JSON(503, gin.H{"status": "failed"})
}
c.JSON(200, gin.H{"status": "OK"})
}
处理函数返回错误消息取决于它应该做什么,因为我有很多带有重复错误处理代码的函数来产生错误响应。
如何包装此处理程序以外部化错误处理和响应格式。例如:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/status", wrapper(handler_status))
r.GET("/health", wrapper(handler_health))
r.Run(":8080")
}
func wrapper(f func(c *gin.Context) (string, error)) gin.HandlerFunc {
status, err := f()
if err != nil {
c.JSON(503, gin.H{"status": err})
return
}
c.JSON(200, gin.H{"status": "OK"})
}
func handler_status(c *gin.Context) (string, error) {
var status string
if err := c.ShouldBindJSON(&status); err != nil {
return "failed", err
}
return status, nil
}
func handler_health(c *gin.Context) (string, error) {
return "roger", nil
}
但我无法访问 wrapper() 中的 *gin.Context ...解决此问题的最佳方法是什么?
【问题讨论】:
-
在您的
wrapper中,您实际上忘记了返回HandlerFunc。像这样的东西:play.golang.org/p/IkE9i3OaYnx -
整个概念被称为中间件。您可以在路由中放置多个处理函数,例如
r.GET("/myEndpoint", middleware1, middleware2, handler)和中间件 1 和中间件 2 内,您可以执行c.Next()以在当前中间件中“冻结”并跳转到下一个等等。你可以在这里阅读更多内容github.com/gin-gonic/gin#using-middleware