使用gin golang框架配置mongo

时间:2014-12-03 22:59:12

标签: mongodb go

我正在尝试在Go应用中配置mongo。我正在使用Gin框架。我也使用mongo的mgo V2驱动程序。我想作为middlware连接到mongo。这就是我得到的:

func Run(cfg common.Config) error {

doWorkResource := &DoWorkResource{db: dbmap}

r := gin.New()

r.Use(middleware.DB())


r.POST("/register", doWorkResource.Register)
r.POST("/login", doWorkResource.Login)

r.Run(cfg.SvcHost)

return nil
}

这是数据库功能:

func DB() gin.HandlerFunc {
   session, err := mgo.Dial("localhost:27017")
   if err != nil {
       panic(err)
   }

   defer session.Close()

   return func(c *gin.Context) {
        s := session.Clone()

        db := s.DB("testing").C("testData")
        err = db.Insert(&Person{"Ale", "+55 53 8116 9639"},
            &Person{"Cla", "+55 53 8402 8510"})
        if err != nil {
            log.Fatal(err)
        }

        c.Next()
   }
}

type Person struct {
  Name  string
  Phone string
}

如果我直接从main函数运行它,则执行插入,但如果它是从DB()函数运行则不执行。实际上,我在DB()函数的return语句中记录,并且没有执行任何操作。我有一种感觉,我需要将其称为我的一个端点的参数,但当我这样做时,我得到了

cannot use middleware.DB (type func() gin.HandlerFunc) as type gin.HandlerFunc in argument to r.RouterGroup.POST

1 个答案:

答案 0 :(得分:1)

看起来你的问题就在这里:

defer session.Close()

当您注册中间件时,您真正在做的事情不是每次呼叫进入时调用该中间件,而是定义每次呼叫进入时要执行的操作。首先,您运行一组初始命令。那将是这一部分:

session, err := mgo.Dial("localhost:27017")
    if err != nil {
    panic(err)
}

defer session.Close()

然后你返回一组指令,每当你的一个端点被击中时运行,这就是这个部分:

s := session.Clone()

db := s.DB("testing").C("testData")
err = db.Insert(&Person{"Ale", "+55 53 8116 9639"},
    &Person{"Cla", "+55 53 8402 8510"})
if err != nil {
    log.Fatal(err)
}

c.Next()

当您从中间件初始化程序返回时,它会激活defer语句。然后,当第一个调用进来并尝试运行以HandlerFunc形式返回的指令时,它会失败,因为它尝试使用的会话已经关闭。