-1

自从我加入 Gophers 团队以来已经有几个星期了。到现在为止还挺好。我开始了一个使用光纤网络框架来构建后端 API 的新项目。

我使用MongoDB作为我的数据库。

数据库/db.go

package database

import (
    "context"
    "log"
    "time"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

var DB *mongo.Database

// InitMongo : Initialize mongodb...
func connectToMongo() {
    log.Printf("Initializing database")

    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        log.Fatal("Could not able to connect to the database, Reason:", err)
    }
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

    err = client.Connect(ctx)
    if err != nil {
        log.Fatal("Context error, mongoDB:", err)
    }

    //Cancel context to avoid memory leak
    defer cancel()

    defer client.Disconnect(ctx)

    // Ping our db connection
    err = client.Ping(context.Background(), readpref.Primary())
    if err != nil {
        log.Fatal("Ping, mongoDB:", err)
    }

    log.Printf("Database connected!")

    // Create a database
    DB = client.Database("golang-test")

    return
}

// In Golang, init() functions always initialize whenever the package is called.
// So, whenever DB variable called, the init() function initialized
func init() {
    connectToMongo()
}

控制器/mongo.controller/mongo.controller.go

package mongocontroller

import (
    "log"

    "github.com/gofiber/fiber/v2"
    service "gitlab.com/.../services/mongoservice"
)

// GetPersons godoc
// @Summary Get persons.
// @Description Get persons
// @Tags persons
// @Produce json
// @Success 200 {object} []service.Person
// @Failure 400 {object} httputil.HTTPError
// @Failure 404 {object} httputil.HTTPError
// @Failure 500 {object} httputil.HTTPError
// @Router /v1/persons [get]
func GetPersons(c *fiber.Ctx) error {
    res, err := service.GetPersons()
    if err != nil {
        log.Fatal("ERROR: in controller...", err)
    }

    return c.JSON(res)
}

服务/mongoservice/mongo.service.go

package mongoservice

import (
    "context"
    "log"

    database "gitlab.com/.../database"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
)

// Person : ...
type Person struct {
    ID   primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
    Name string             `bson:"name,omitempty" json:"name,omitempty"`
    Age  int                `bson:"age,omitempty" json:"age,omitempty"`
}


func GetPersons() ([]Person, error) {

    ctx := context.Background()

    persons := []Person{}

    log.Printf("mongo data...", ctx)

    cur, err := database.DB.Collection("persons").Find(ctx, bson.M{})
    if err != nil {
        log.Fatal(err)
    }

    // Iterate through the returned cursor.
    for cur.Next(ctx) {
        var person Person
        cur.Decode(&person)
        persons = append(persons, person)
    }

    defer cur.Close(ctx)

    return persons, err
}

这是我存储在数据库中的数据:

在此处输入图像描述

问题是,服务中的cur, err := database.DB.Collection("persons").Find(ctx, bson.M{}) 行总是 throwing Client is disconnected

任何帮助表示赞赏!

谢谢你。

4

1 回答 1

3

您正在调用defer client.Disconnect(ctx)创建连接 ( ) 的同一函数,connectToMongo 因此它将在调用该函数后关闭连接。您应该在完成任务后返回连接并关闭。我的意思是这些部分: defer cancel() defer client.Disconnect(ctx)

于 2021-08-19T05:38:06.757 回答