我有一个简单的DbSession中间件,将* db.SQL值设置为“ db”的上下文键。我在路由器中添加了该中间件的实例,但是在处理请求时,上下文的键中不存在“ db”键。
我已将日志记录添加到中间件,并且可以验证该中间件是否从未被调用,即使已通过Use()添加到路由器中也是如此。我还检查了上下文键,但在那里没有看到我的“ db”键。
这是我的中间件。
// DbSession returns a gin middleware adding the database connection to the request context.
func DbSession(db *sql.DB) gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("inside DbSession middleware")
c.Set("db", db)
c.Next()
}
}
这就是将它添加到我的main()函数中的方式。
var db *sql.DB
func main() {
initEnv()
initDb()
defer db.Close()
r := InitRouter()
r.Use(DbSession(db))
_ = r.Run()
}
在我的处理程序中,我尝试检索它。
func GetProfile(c *gin.Context) {
// ...
// Get our db session from the request context.
db := c.MustGet("db").(*sql.DB)
// ...
}
当访问端点时,我希望上下文具有'db'键及其关联的* sql.DB值。相反,我感到以下恐慌。
[GIN-debug] Listening and serving HTTP on :8080
2019/07/13 11:45:05 http: panic serving [::1]:55014: Key "db" does not exist
这似乎是一个微不足道的示例,我希望它能成为“ Just Work(tm)”。我认为这一定是我忽略的真正琐碎的事情。任何见解都将不胜感激。