如何使用mongo-driver连接到其他软件包

时间:2019-07-10 12:36:44

标签: go gin-gonic

我在gin框架中使用Mongo-driver。我已经编写了连接数据库包中的mongodb的代码,并且如果我在db/connect.go中编写查询,它可以工作,但是当我在其他包中使用相同的dbcon时却不能。

db / connect.go:

var dbcon *mongo.Database
func ConfigDB() (*mongo.Database) {
    ctx := context.Background()
    client, err := mongo.Connect(
            ctx,
        options.Client().ApplyURI("mongodb://localhost:27017/todo"),
    )
    if err != nil {
        log.Fatal(err)
    }
    dbcon = client.Database("todo")

}

如果我在同一个db / connect.go中使用下面的代码,则可以正常工作,但是当我在handler / task.go中使用相同的代码时,则不会。

func CreateTask() () {
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    res, err := dbcon.Collection("ttest").InsertOne(ctx, bson.D{
        {"task", "test4"},
        {"createdAt", "test"},
        {"modifiedAt","test3"},
    })
    if err != nil {
        fmt.Println( err))
    }
}

我必须在我的项目中实现mongo-driver,但是由于上述问题,我面临着实现难题。

2 个答案:

答案 0 :(得分:0)

您必须导入才能将db / connect.go文件导入到handler / task.go中。这是行不通的,因为它们位于不同的软件包中。 我认为您可以像这样重构代码

func ConfigDB() (*mongo.Database) {
    ctx := context.Background()
    client, err := mongo.Connect(
            ctx,
        options.Client().ApplyURI("mongodb://localhost:27017/todo"),
    )
    if err != nil {
        log.Fatal(err)
    }
    return client.Database("todo")

}

import (
"db/connect"
)

func CreateTask() () {
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    res, err := ConfigDB().Collection("test").InsertOne(ctx, bson.D{
        {"task", "test4"},
        {"createdAt", "test"},
        {"modifiedAt","test3"},
    })
    if err != nil {
        fmt.Println( err))
    }
}

答案 1 :(得分:0)

在这里,我发布了一个完整的工作示例。 我在一个全局变量中捕获了mongo会话连接。这样,您就可以在项目中的任何位置访问活动连接。

package main

import (
    "fmt"
    "net/http"
    "os"

    "github.com/gin-gonic/gin"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

// SESSION ensure global mongodb connection
var SESSION *mgo.Session

func init() {
    // mongodb manual connection using host ip. Replace your host IP address there
    session, err := mgo.Dial("172.17.0.2")
    // session, err := mgo.Dial("<HostIP>")
    Must(err)
    fmt.Println(err)
    SESSION = session
}

func main() {

    port := os.Getenv("PORT")
    gin.SetMode(gin.ReleaseMode)
    // gin.SetMode(gin.DebugMode)
    r := gin.Default()
    r.Use(mapMongo)

    if port == "" {
        port = "8000"
    }
    r.POST("/api/v1/task", CreateTask)

    http.ListenAndServe(":"+port, r)

}

// close connection
func mapMongo(c *gin.Context) {
    s := SESSION.Clone()
    defer s.Close()
    c.Set("mongo", s.DB("mongotask"))
    c.Next()
}

// Must to catch the mongo panic issues
func Must(err error) {
    if err != nil {
        panic(err.Error())
    }
}

// NewTask Struct/model
type NewTask struct {
    Id   bson.ObjectId `json:"_id,omitempty" bson:"_id,omitempty"`
    Task string
}

// Mongo bson generate New unique Id each request
func (self *NewTask) Init() {
    self.Id = bson.NewObjectId()
}

const (
    // CollectionTask is the collection name
    CollectionTask = "taskCollection"
)

// CreateTask to create new Task message
func CreateTask(c *gin.Context) {
    var newTask NewTask
    err := c.BindJSON(&newTask)
    if err != nil {
        c.Error(err)
        return
    }
    mongodb := c.MustGet("mongo").(*mgo.Database)
    con := mongodb.C(CollectionTask)
    // fmt.Println(newTask)
    con.Insert(newTask)
    if err != nil {
        c.Error(err)
    }

}