
[英]MongoDB Atlas Golang mgo package "No reachable servers" error
[英]Golang / MGO — panic: no reachable servers
我具有连接到Mongo的以下功能。 为了进行测试,我关闭了mongod,并希望允许该程序在w / 0 mongo不可用的情况下继续运行。 如果无法连接服务器,MGO似乎会引发紧急情况,因此我在下面编写了一个延迟/恢复操作,但是紧急情况仍然导致程序退出。 从中恢复的正确方法是什么?
func connectToMongo(sess *mgo.Session, coll *mgo.Collection, sessionErr error) bool {
fmt.Println("enter main - connecting to mongo")
// tried doing this - doesn't work as intended
defer func() {
if r := recover(); r != nil {
var ok bool
err, ok := r.(error)
if !ok {
fmt.Printf("pkg: %v, error: %s", r, err)
}
}
return false
}()
maxWait := time.Duration(5 * time.Second)
sess, sessionErr = mgo.DialWithTimeout("localhost", maxWait)
if sessionErr == nil {
session.SetMode(mgo.Monotonic, true)
coll = session.DB("MyDB").C("MyCollection")
} else { // never gets here
fmt.Println("Unable to connect to local mongo instance!")
}
return true
}
运行您发布的代码的以下版本。 尽量不要修改代码,至少不要更改行号的位置。 这样,如果您发布堆栈跟踪,则数字将匹配。
package main
import (
"fmt"
"time"
)
import (
"labix.org/v2/mgo"
)
func connectToMongo() bool {
ret := false
fmt.Println("enter main - connecting to mongo")
// tried doing this - doesn't work as intended
defer func() {
if r := recover(); r != nil {
fmt.Println("Detected panic")
var ok bool
err, ok := r.(error)
if !ok {
fmt.Printf("pkg: %v, error: %s", r, err)
}
}
}()
maxWait := time.Duration(5 * time.Second)
session, sessionErr := mgo.DialWithTimeout("localhost:27017", maxWait)
if sessionErr == nil {
session.SetMode(mgo.Monotonic, true)
coll := session.DB("MyDB").C("MyCollection")
if ( coll != nil ) {
fmt.Println("Got a collection object")
ret = true
}
} else { // never gets here
fmt.Println("Unable to connect to local mongo instance!")
}
return ret
}
func main() {
if ( connectToMongo() ) {
fmt.Println("Connected")
} else {
fmt.Println("Not Connected")
}
}
当MongoDB启动时,我看到:
enter main - connecting to mongo
Got a collection object
Connected
当MongoDB关闭时,我看到:
enter main - connecting to mongo
Unable to connect to local mongo instance!
Not Connected
如果您没有看到相同的行为,请发布输出,包括看到的恐慌。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.