mongodb - 连接到远程mongo服务器可以正常工作,但是通过Go连接时,它会出现错误:超出了上下文截止日期

标签 mongodb go amazon-ec2

我正在使用以下ssh tunneling命令连接到远程mongo服务器:ssh -i document-db-tun.pem -L 27017:docdb.cluster-cf.us-east-2.docdb.amazonaws.com:27017 ubuntu@ec2-111-111-111-111.us-east-2.compute.amazonaws.com -N另外,使用mongo命令在本地连接到mongo服务器也可以正常工作。
enter image description here
但是,当我尝试使用golang代码在本地连接时,会引发Mongo connection ckeck failed. Err: context deadline exceeded错误。

const (
    mongoTimeout = time.Second * 10
)

func initMongo() {
    mongoConf := common.Conf.ServiceConfig.Databases.Mongo

    ctx, _ := context.WithTimeout(context.Background(), mongoTimeout)
    uri := fmt.Sprintf("mongodb://127.0.0.1:27017")
    if common.IsSentryEnabled() {
        sentry.AddBreadcrumb(&sentry.Breadcrumb{
            Message:  fmt.Sprintf("Connecting to mongo server at: '%v'", uri),
            Category: common.SENTRY_CAT_REPO,
            Level:    sentry.LevelInfo,
        })
    }
    client := options.Client().
        SetReadPreference(readpref.SecondaryPreferred()).
        SetAppName("catalog").
        SetMaxConnIdleTime(time.Microsecond * 100000).
        SetAuth(options.Credential{
            Username: mongoConf.Username,
            Password: mongoConf.Password,
        }).
        ApplyURI(uri)

    pureMongoClient, err := mongo.Connect(ctx, client)
    if err != nil {
        if common.IsSentryEnabled() {
            sentry.AddBreadcrumb(&sentry.Breadcrumb{
                Message:  "Error connecting to mongo",
                Category: common.SENTRY_CAT_REPO,
                Level:    sentry.LevelFatal,
            })
            sentry.ConfigureScope(func(scope *sentry.Scope) {
                scope.SetTags(map[string]string{
                    common.SENTRY_SCOPE_KEY: common.SENTRY_SCOPE_MONGO,
                    common.SENTRY_TYPE_KEY:  common.SENTRY_TYPE_DB,
                })
            })
            sentry.CaptureException(err)
            sentry.Flush(time.Second * 5)
        }

        panic(fmt.Sprintf("Failed to establish mongo connection. Err: %v ", err))
    }

    err = pureMongoClient.Ping(ctx, readpref.Primary())
    if err != nil {
        if common.IsSentryEnabled() {
            sentry.AddBreadcrumb(&sentry.Breadcrumb{
                Message:  "Mongo connection ckeck failed",
                Category: common.SENTRY_CAT_REPO,
                Level:    sentry.LevelFatal,
            })
            sentry.ConfigureScope(func(scope *sentry.Scope) {
                scope.SetTags(map[string]string{
                    common.SENTRY_SCOPE_KEY: common.SENTRY_SCOPE_MONGO,
                    common.SENTRY_TYPE_KEY:  common.SENTRY_TYPE_DB,
                })
            })
            sentry.CaptureException(err)
            sentry.Flush(time.Second * 5)
        }

        panic(fmt.Sprintf("Mongo connection ckeck failed. Err: %v ", err))
    }

    mongoDB := pureMongoClient.Database(mongoConf.Dbname)

    dbManager.MongoDB = &MGODatabase{
        Database: mongoDB,
    }
}
代码中使用的用户名和密码是连接到远程服务器所需的用户名和密码。
使用golang代码连接到远程mongo服务器时可能出什么问题?

最佳答案

golang mongo driver docs:

创建options.ClientOptions时,方法的顺序
所谓的事情。以后的Set *方法将覆盖
先前的Set *方法调用。这包括ApplyURI方法。
这使调用者可以确定选项的优先顺序
应用。例如,如果在SetAuth之前调用ApplyURI,则
来自SetAuth的凭据将覆盖连接中的值
串。如果在SetAuth之后调用ApplyURI,则其值将
覆盖SetAuth中的内容。

opts参数使用options.MergeClientOptions处理,
这将覆盖先前选项的整个选项字段
没有部分覆盖。例如,如果在验证中设置了用户名
第一个选项的字段,第二个设置密码,但是
没有用户名,合并后“用户名”字段将为空。

您的ApplyURI本质上会覆盖您为options.ClientOptions实例设置的所有先前选项。

尝试像这样更改顺序:

client := options.Client().
    ApplyURI(uri).
    SetReadPreference(readpref.SecondaryPreferred()).
    SetAppName("catalog").
    SetMaxConnIdleTime(time.Microsecond * 100000).
    SetAuth(options.Credential{
        Username: mongoConf.Username,
        Password: mongoConf.Password,
    })

希望能帮助到你。

关于mongodb - 连接到远程mongo服务器可以正常工作,但是通过Go连接时,它会出现错误:超出了上下文截止日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60559638/

相关文章:

MongoDB:仅获取过去 24 小时内创建的文档?

Go嵌入式自定义接口(interface)

excel - 如何 Swagger 发送 REST 响应 excel 文件?

amazon-ec2 - 可以使用 Ansible "serial"参数指定区域吗?

amazon-web-services - 检索通过 CFT 创建的 EC2 托管 Apache 应用程序的 IP 地址和端口号

postgresql - 在 ec2 中升级 postgresql

python - 怎么说......当字段是数字时匹配......在mongodb中?

java - 使用 MongoDB/Morphia 中的对象以声明方式包装数组元素

node.js - 如何更新 Mongoose 中的特定字段?

Go- 为什么我的 For 循环会抛出 "Unexpected Semi-colon or New-line"?