【问题标题】:Trying to connect to Azure Cosmos DB from GoLang Application尝试从 GoLang 应用程序连接到 Azure Cosmos DB
【发布时间】:2022-02-06 19:10:58
【问题描述】:

我创建了一个 Cosmos DB,并尝试通过我的 GoLang 应用程序连接到它。代码如下:

type DB struct {
    MongoDB *mongo.Client
}

var dbConn = &DB{}

func NewMongoDB(connectionString string) (*mongo.Client, error) {
    //Create a context to use with the connection
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    clientOptions := options.Client().ApplyURI(connectionString).SetDirect(true)
    client, err := mongo.NewClient(clientOptions)
    if err != nil {
        log.Fatalf("unable to initialize new Cosmos DB client %v", err)
        return nil, err
    }

    err = client.Connect(ctx)
    if err != nil {
        log.Fatalf("unable to initialize connection %v", err)
        return nil, err
    }

    err = TestConnection(client, &ctx)
    if err != nil {
        log.Fatal(err)
        return nil, err
    }

    return client, err
}

func ConnectNoSQL(connectionString string) (*DB, error) {
    //Create a new Mongo DB client
    db, err := NewMongoDB(connectionString)
    if err != nil {
        log.Fatal(err)
        return nil, err
    }
    dbConn.MongoDB = db

    return dbConn, err
}

func TestConnection(client *mongo.Client, ctx *context.Context) error {
    if err := client.Ping(*ctx, nil); err != nil {
        fmt.Println("Could not PING database due to - ", err)
        return err
    }
    return nil
}

...

// 2. Connect to database
    log.Println("Connecting to database ..") //Create the URI we will use to connect to out cosmosDB
    connecturi := fmt.Sprintf(
        "mongodb://%s:%s@%s.documents.azure.com:%s/%s?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@%s@",
        *dbUser,
        *dbPassword,
        *dbHost,
        *dbPort,
        *dbName,
        *dbHost)
    db, err := driver.ConnectNoSQL(connecturi)
    if err != nil {
        log.Fatal("Cannot to databse ...")
    }

这是错误信息:

2022/02/01 22:48:53 服务器选择错误:超出上下文期限, 当前拓扑:{类型:单,服务器:[{地址: 场景原型 db.documents.azure.com:443,类型:未知,最后 错误:连接握手期间发生连接()错误: 连接({COSMOS-DB-NAME}.documents.azure.com:443[-22])长度 of read message too large: 已读消息长度太大 }, ] }

我不确定发生了什么。我按照微软官方文档中的教程-https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb/create-mongodb-go,但没能做到。

看起来是这样的:

  1. 通过 mongo.NewClient 创建一个新客户端
  2. 设法连接到它
  3. 当我尝试 PING 时,TestConnection 失败。

有什么想法吗?另外,这可能是因为我的 API 设置为 SQL api 而不是 Mongo API(可能是愚蠢的问题,但我想了解错误的含义)

谢谢!

【问题讨论】:

  • 您几乎回答了自己的问题:您不能针对使用 SQL API 的 Cosmos DB 实例使用 MongoDB 驱动程序。您必须创建一个 MongoDB API 实例,它适用于所有 MongoDB 驱动程序。
  • 同意@DavidMakogon 提到的,过去遇到过这个问题。 CosmosDb 是多个 DB 端点的伞形名称,但您需要单独配置它们并且它们不可互换,(您不能从 sql 切换到 mongo)

标签: azure go azure-cosmosdb azure-cosmosdb-sqlapi azure-cosmosdb-mongoapi


【解决方案1】:

因此,问题与问题和 cmets 中指定的完全一样。资源是作为 SQL API 而不是 MongoDB 创建的,即使错误有点误导或至少不够详细。

【讨论】:

    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 2019-03-30
    • 2020-06-04
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多