使用gopkg.in/mgo.v2连接MongoDB遇no reachable servers错误求助
以下是针对你遇到的问题的具体排查和解决步骤:
替换localhost为127.0.0.1尝试连接
部分环境下localhost会解析到IPv6地址::1,而MongoDB默认可能只监听IPv4的127.0.0.1。修改连接串为:s, err := mgo.Dial("mongodb://127.0.0.1:27017")检查MongoDB的绑定IP配置
打开MongoDB的配置文件(通常是mongod.conf),找到bindIp参数,确保它包含127.0.0.1或者设置为0.0.0.0(测试场景可用,生产环境需谨慎)。修改后重启MongoDB服务。验证端口连通性
使用命令行工具测试端口是否开放:nc -zv localhost 27017 # Windows环境可使用telnet telnet localhost 27017如果连接失败,说明端口未开放,检查MongoDB是否真的在27017端口运行,或者是否有防火墙/安全组拦截。
检查MongoDB认证配置
如果你的MongoDB开启了认证(启动参数含--auth或配置文件开启authorization: enabled),连接串需要携带用户名和密码:s, err := mgo.Dial("mongodb://username:password@localhost:27017")未指定认证信息时,MongoDB会拒绝连接,表现为“no reachable servers”。
调整mgo连接选项增加调试信息
使用DialWithInfo设置超时和自定义拨号逻辑,获取更详细的错误信息:import ( "log" "net" "time" "gopkg.in/mgo.v2" ) func getSession() *mgo.Session { dialInfo, err := mgo.ParseURL("mongodb://localhost:27017") if err != nil { log.Fatal("Failed to parse URL: ", err) } dialInfo.Timeout = 10 * time.Second dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { conn, err := net.DialTimeout("tcp", addr.String(), dialInfo.Timeout) if err != nil { log.Println("Dial error detail:", err) } return conn, err } s, err := mgo.DialWithInfo(dialInfo) if err != nil { log.Fatal("Failed to connect to MongoDB: ", err) } return s }查看MongoDB日志
检查MongoDB的日志文件(Linux通常在/var/log/mongodb/mongod.log,Windows在C:\Program Files\MongoDB\Server\X.X\log\mongod.log),日志会记录连接失败的具体原因,比如认证失败、IP被拒绝等。考虑mgo.v2的兼容性问题
mgo.v2是已停止维护的旧库,对MongoDB 4.2及以上版本存在兼容问题。如果你的MongoDB版本较新,建议迁移到官方的go.mongodb.org/mongo-driver/mongo库,它支持最新的MongoDB特性和协议。
内容的提问来源于stack exchange,提问作者rkmangalp

