Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 使用gin-golang框架配置mongo_Mongodb_Go - Fatal编程技术网

Mongodb 使用gin-golang框架配置mongo

Mongodb 使用gin-golang框架配置mongo,mongodb,go,Mongodb,Go,我正在尝试在我的Go应用程序中配置mongo。我正在使用这个框架。我也在使用mongo的驱动程序。我想作为中间软件连接到mongo。以下是我得到的: func Run(cfg common.Config) error { doWorkResource := &DoWorkResource{db: dbmap} r := gin.New() r.Use(middleware.DB()) r.POST("/register", doWorkResource.Register) r.

我正在尝试在我的Go应用程序中配置mongo。我正在使用这个框架。我也在使用mongo的驱动程序。我想作为中间软件连接到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
}
这是DB函数:

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
}
如果直接从主函数运行插入,则执行插入,但如果从DB()函数运行插入,则不执行插入。事实上,我是从DB()函数的return语句中登录的,其中没有任何内容被执行。我有一种感觉,我需要把它称为我的一个端点的参数,但当我这样做时,我得到了


无法将middleware.DB(type func()gin.HandlerFunc)用作r.RouterGroup.POST的参数中的类型gin.HandlerFunc

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()
然后返回一组指令,以便在每次命中一个端点时运行,这将是以下部分:

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
形式返回的指令时,它会失败,因为它尝试使用的会话已经关闭

啊,这是有道理的。谢谢@Verran。最后,我创建了一个单独的函数来初始化数据库,并为每个端点分别与之交互。我不希望每次命中端点时都执行相同的db操作。除了日志记录(您希望对每个端点执行相同的操作)之外,中间件还有其他用途吗?我想说的是身份验证,比如检查OAuth密钥、根据白名单检查ip等等。。如果要创建初始数据库会话,并通过中间件为每个单独的连接返回原始会话的副本,以保持db调用的并发性,那么只要不关闭正在调用copy()的初始会话,也可以这样做。我确信有比基于单个用例的场景更多的场景,但这只是我的想法。