Mongodb 使用gin-golang框架配置mongo
我正在尝试在我的Go应用程序中配置mongo。我正在使用这个框架。我也在使用mongo的驱动程序。我想作为中间软件连接到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.
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()的初始会话,也可以这样做。我确信有比基于单个用例的场景更多的场景,但这只是我的想法。