Golang API连接MongoDB失败求助:遇连接超时与域名解析错误
初始报错信息
2022/12/06 19:09:25 server selection error: server selection timeout, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: ac-tqorttq-shard-00-02.atpezds.mongodb.net:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp 52.28.222.2:27017: i/o timeout }, { Addr: ac-tqorttq-shard-00-00.atpezds.mongodb.net:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp 18.197.37.129:27017: i/o timeout }, { Addr: ac-tqorttq-shard-00-01.atpezds.mongodb.net:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp 18.195.134.220:27017: i/o timeout }, ] }
我的连接代码
func init() { clientOptions := options.Client().ApplyURI(configs.GetEnv("MONGOURI")) client, err := mongo.Connect(context.TODO(), clientOptions) checkErr(err) err = client.Ping(context.TODO(), nil) checkErr(err) fmt.Println("connected to database successfully") notesCollection = openCollection("notes_collection") userCollection = openCollection("user_collection") }
移除连接字符串中"+srv"后的新报错
2022/12/06 19:16:46 server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: cluster0.atpezds.mongodb.net:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup cluster0.atpezds.mongodb.net: No address associated with hostname }, ] }
可能的解决方向
- 检查网络与防火墙:用
telnet ac-tqorttq-shard-00-00.atpezds.mongodb.net 27017测试端口连通性,确认本地机器能访问MongoDB Atlas节点。公司/校园网络可能有防火墙限制,需开放对应端口或使用合规代理。 - 恢复+srv连接字符串:MongoDB Atlas副本集的标准连接格式必须带
+srv,它会自动解析所有副本节点,不要手动移除。同时检查连接字符串里的用户名、密码、集群名称是否完全正确,特殊字符(如@、:)要做URL转义。 - 调整连接超时参数:在创建clientOptions时增加超时时间,避免因网络延迟导致超时:
import "time" // ... clientOptions := options.Client().ApplyURI(configs.GetEnv("MONGOURI")). SetConnectTimeout(10 * time.Second). SetServerSelectionTimeout(15 * time.Second) - 检查Atlas IP白名单:登录MongoDB Atlas控制台,确认本地机器的公网IP已添加到集群的IP访问白名单中,否则Atlas会直接拒绝连接请求。
- 验证DNS解析:执行
nslookup ac-tqorttq-shard-00-00.atpezds.mongodb.net确认域名能正常解析到对应IP,若解析失败需更换DNS服务器(如用8.8.8.8)。
内容的提问来源于stack exchange,提问作者Ali

