web-dev-qa-db-fra.com

Mangouste avec ReplicaSet sur Atlas

J'ai une réplique placée sur MongoDB Atlas et voici ma chaîne de connexion mongo Shell qui se connecte parfaitement:

$ mongo "mongodb://MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE?replicaSet=MY_REPLICASET-NAME-shard-0" --ssl --username MY_USERNAME --password MY_PASSWORD --authenticationDatabase MY_ADMIN_DATABASE

Comment puis-je le convertir pour l'utiliser chez la mangouste? Comment puis-je construire ma variable uri et options?

J'ai essayé ce qui suit sans succès:

  // connection string using mongoose:
  var uri = 'mongodb://MY_USER:MY_PASSWORD@' +
    'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE';

  var options = {
    replset: {
      ssl: true,
      authSource: 'MY_ADMIN_DATABASE',
      rs_name: 'MY_REPLICASET_NAME-shard-0'
    }
  };

  mongoose.connect(uri, options);
  var db = mongoose.connection;

J'ai essayé d'inclure l'utilisateur: et les options de pass: on, en supprimant MY_USER: MY_PASSWORD @ d'uri, modifiez le nom rs_name en replicaSet à chaque tentative infructueuse. Il semble que mangouste n'envisage pas l'option authSource.

En utilisant les mongojs, cela fonctionne bien avec le code suivant:

  // connection string using mongojs:
  var uri = 'mongodb://MY_USER:MY_PASSWORD@' +
    'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' +
    'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE';

  var options = {
    ssl: true,
    authSource: 'MY_ADMIN_DATABASE',
    replicaSet: 'MY_REPLICASET_NAME-shard-0'
  };

  var db = mongojs(uri,'', options);

Mais, je dois utiliser mangouste parce que l'ODM dans mon projet.

Comment puis-je construire ma variable uri et options en utilisant mangouste?

6
Biruel Rick

SUR MONGODB 3.4.x

J'ai résolu ce problème en plaçant la valeur 'options' directement dans la chaîne 'uri', conformément à la documentation ( http://mongoosejs.com/docs/connections.html ) dans la section 'Connexions de l'ensemble de réplicas'.

// connection string using mongoose:
var uri = 'mongodb://MY_USER:MY_PASSWORD@' +
  'MY_SERVER-shard-00-00-clv3h.mongodb.net:27017,' +
  'MY_SERVER-shard-00-01-clv3h.mongodb.net:27017,' +
  'MY_SERVER-shard-00-02-clv3h.mongodb.net:27017/MY_DATABASE' +
  'ssl=true&replicaSet=MY_REPLICASET_NAME-shard-0&authSource=MY_ADMIN_DATABASE';

mongoose.connect(uri);
var db = mongoose.connection;

Maintenant ça fonctionne bien!

AVIS AVEC MONGODB 3.6

Sur MongoDB Atlas utilisant la version 3.6.x, la chaîne de connexion a été modifiée pour utiliser un serveur DNS, ce qui raccourcit le lien.

mongodb + srv: // MY_USER: MY_PASSWORD@MY_SERVER.mongodb.net/MY_DATABASE

... si vous utilisez cette chaîne de connexion dans votre application, celle-ci se connectera avec succès, mais il ne pourra lire et écrire qu'avec les utilisateurs d'atlas disposant d'un accès privilégié (atlasAdmin, readWriteAnyDatabase ...). 

Pour que vous puissiez travailler avec un utilisateur spécifique disposant uniquement du privilège readWrite de votre base de données, vous devez conserver la même chaîne de connexion que celle utilisée dans MongoDB 3.4, car le mannequin n'a pas reconnu l'option DNS (mongodb + srv).

P.S. Toutes les nouvelles ressources de MongoDB 3.6.x continueront à fonctionner normalement!

10
Biruel Rick

Ajouter un nom d'utilisateur et un mot de passe à la connexion à la base de données

mongodb://[username:password@]Host1[:port1][,Host2[:port2],...[,hostN[:portN]]][/[database][?options]]

Format de chaîne de connexion standard

0
Engin Kartal