我正在使用以下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服务器也可以正常工作。
但是,当我尝试使用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/