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":{}}}}