首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将mongo驱动程序连接到其他包中

如何将mongo驱动程序连接到其他包中
EN

Stack Overflow用户
提问于 2019-07-10 12:36:44
回答 2查看 1.7K关注 0票数 1

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

db/connect.go:

代码语言:javascript
复制
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中使用下面的代码,那么它可以工作,但是当我在处理程序/task.go中使用相同的代码时,它就不会工作了。

代码语言:javascript
复制
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,但是由于上面的问题,我面临着要实现的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-10 16:24:23

要将db/connect.go文件导入到处理程序/task.go中,必须导入。这不起作用,因为它们在不同的包中。在我看来,您可以这样重构您的代码

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-07-10 21:27:40

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56970867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档