4
votes

Impossible de se connecter à la base de données Mongo Cloud mongodb dans Golang sur Ubuntu

J'ai ce code Go pour me connecter à ma base de données Mongo Cloud:

2019/04/13 00:20:37 Error connecting to Database: error parsing uri (mongodb+srv://User:Password@cluster0-gpxjk.gcp.mongodb.net/test?retryWrites=true): lookup cluster0-gpxjk.gcp.mongodb.net on 127.0.0.53:53: cannot unmarshal DNS message
exit status 1

J'ai déjà exécuté ce code sur une machine Windows, et cela a fonctionné. Maintenant, j'ai essayé de l'exécuter sur ubuntu, et j'obtiens l'erreur suivante:

func connectToDataBase() {
    ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
    defer cancel()
    client, err := mongo.Connect(ctx, options.Client().ApplyURI(dbURL))
    if err != nil {
        log.Fatal("Error connecting to Database: ", err.Error())
    }
    DB = client.Database("storyfactory")
}

Je ne sais pas, pourquoi cela a fonctionné sous Windows, et maintenant ce n'est pas le cas sur ubuntu .
Merci pour votre aide!


1 commentaires

Questions: 1) Utilisez-vous Golang version 1.11? 2) Utilisez-vous Docker pour Ubuntu? Ou Windows et Ubuntu sont des machines complètement différentes?


3 Réponses :


15
votes

impossible d'annuler le message DNS

Ce n'est pas tout à fait lié au pilote MongoDB Go.

Il existe un correctif dans Go version 1.11.x # 10622 net: noms de domaine cible dans les enregistrements SRV ne doit pas être compressé qui resserre la façon dont les enregistrements SRV sont lus pour suivre la RFC-2782.

Si un serveur DNS faisant autorité (non conforme) envoie des enregistrements SRV en utilisant la compression de nom de domaine, le net.lookupSRV () générera une erreur avec ne peut pas démarsaliser le message DNS ( net / lookup_unix.go # L130 ). Par exemple, le DNS Docker intégré effectue peut-être la compression du nom du serveur.

Les solutions de contournement pour Go v1.11 sont:

  • Utilisez l'URI MongoDB non SRV
  • Mettez à jour le contenu de /etc/resolv.conf en remplaçant le nameserver pour utiliser un serveur DNS conforme et / ou public, c'est-à-dire 1.1.1.1 ou 8.8.8.8

Voir aussi GODRIVER-829


2 commentaires

en fait, la mise à jour de resolv.conf a bien fonctionné. Je vous remercie


@OWADVL: attention à ce que les modifications apportées à resolv.conf ne persistent pas aux redémarrages , et c'est non trivial pour résoudre ce problème .



6
votes

La solution consiste à utiliser une chaîne de connexion non SRV. Accédez à Mongo Atlas pour obtenir votre chaîne de connexion comme d'habitude.

Sélectionnez le pilote Java, version 3.4 ou ultérieure

Vous devriez maintenant voir votre chaîne de connexion. Fonctionne avec go1.13.8.


1 commentaires

Merci, cela a fonctionné pour moi et persiste à travers les redémarrages.



1
votes

Une autre option, trouvée ici suggère d'installer resolvconf (pour Ubuntu apt install resolvconf ), ajoutez la ligne nameserver 8.8.8.8 à /etc/resolvconf/resolv.conf.d/base code>, puis exécutez sudo resolvconf -u et pour être sûr que service resolvconf redémarre . Pour vérifier, exécutez systemd-resolution --status .

Vous devriez voir sur la première ligne votre serveur DNS comme ici:

         DNS Servers: 8.8.8.8
          DNS Domain: sa-east-1.compute.internal
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa


0 commentaires