Mongodb 连接(localhost:27017[-4])写入失败:上下文已取消

Mongodb 连接(localhost:27017[-4])写入失败:上下文已取消,mongodb,go,Mongodb,Go,我读到有必要取消上下文。这就是我的db.go的样子: package db import ( "context" "fmt" "log" "os" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/opt

我读到有必要取消上下文。这就是我的
db.go
的样子:

package db

import (
    "context"
    "fmt"
    "log"
    "os"
    "time"

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

const (
    connectionStringTemplate = "mongodb://%s:%s@%s"
)

var DB *mongo.Client
var Ctx context.Context

// Connect with create the connection to MongoDB
func Connect() {
    username := os.Getenv("MONGODB_USERNAME")
    password := os.Getenv("MONGODB_PASSWORD")
    clusterEndpoint := os.Getenv("MONGODB_ENDPOINT")

    connectionURI := fmt.Sprintf(connectionStringTemplate, username, password, clusterEndpoint)

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    client, err := mongo.NewClient(options.Client().ApplyURI(connectionURI))
    if err != nil {
        log.Printf("Failed to create client: %v", err)
    }

    err = client.Connect(ctx)
    if err != nil {
        log.Printf("Failed to connect to cluster: %v", err)
    }

    // Force a connection to verify our connection string
    err = client.Ping(ctx, nil)
    if err != nil {
        log.Printf("Failed to ping cluster: %v", err)
    }

    DB = client
    Ctx = ctx
    log.Printf("Connected to MongoDB!")
}
我在
main.go中执行此操作:

func main() {

    // Configure
    db.Connect()
    defer db.DB.Disconnect(context.Background())

    r := gin.Default()

    // Routes
    //r.GET("/movies", handlers.GetAllMoviesHandler)
    r.POST("/movies", handlers.AddMovieHandler)

    // listen and serve on 0.0.0.0:8080
    r.Run()
}
如果我的本地mongodb正在运行,它就可以正常工作。 现在,当我像这样使用客户端时(我知道命名仍然不好):

我犯了这样的错误

{"msg":{"Code":0,"Message":"connection(localhost:27017[-4]) failed to write: context canceled","Labels":["NetworkError","RetryableWriteError"],"Name":"","Wrapped":{"ConnectionID":"localhost:27017[-4]","Wrapped":{}}}}
当我将
defer cancel()
放在注释中时,它可以正常工作,但我想这是不正确的?。我做错了什么

更新:

当我使用:
result,err:=db.db.Database(“movies”).Collection(“movies”).InsertOne(context.Background(),movie)
而不是ctx。我不完全理解这些用例中上下文的用法。我不确定是否应该在Connect函数中执行
Ctx=Ctx

您已经创建了一个客户端连接,并且无条件超时10秒。这不是创建连接或使用超时的正确方法。通常,当应用程序启动时,您应该创建一次连接,然后为每个请求应用上下文,而不是全局范围的连接。这样,每个请求,而不是每个连接,都会有10秒的超时时间。您可以举一个简单的例子说明如何正确执行此操作吗?您已经创建了一个具有无条件10秒超时的客户端连接。这不是创建连接或使用超时的正确方法。通常,当应用程序启动时,您应该创建一次连接,然后为每个请求应用上下文,而不是全局范围的连接。这样,每个请求,而不是每个连接,都会有10秒的超时时间。你能举一个简单的例子说明如何正确地完成它吗?
{"msg":{"Code":0,"Message":"connection(localhost:27017[-4]) failed to write: context canceled","Labels":["NetworkError","RetryableWriteError"],"Name":"","Wrapped":{"ConnectionID":"localhost:27017[-4]","Wrapped":{}}}}