Как использовать подключение монго-драйвера к другим пакетам - PullRequest
0 голосов
/ 10 июля 2019

Я использую Mongo-driver с каркасом джина. Я написал код для подключения mongodb в пакете БД, и если я пишу запрос внутри db/connect.go, он работает, но когда я использую тот же dbcon в другом пакете, это не так.

дб / 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 голосов
/ 11 июля 2019

Здесь я публикую полный рабочий пример. Я ловлю соединение сеанса Монго в глобальной переменной. Так что в любом месте проекта вы можете получить доступ к активному соединению.

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)
    }

}
0 голосов
/ 10 июля 2019

Вам придется импортировать, чтобы импортировать файл 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))
    }
}
...