web-dev-qa-db-fra.com

Erreur de connexion à Azure: caractère illégal dans le mot de passe avec Mongoose 5.0.1 mais fonctionne dans 4.13.9

J'ai une application node.js déployée sur Azure à l'aide de CosmosDB et de l'API MongoDB. Mon application utilise mangouste qui fonctionne de manière transparente dans 4.13.9.

Mon application qui fonctionne se connecte comme suit:

var configDB = require('./config/database');
var mongoose = require('mongoose');
mongoose.connect(configDB.url, { useMongoClient: true } );
mongoose.Promise = global.Promise;
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));

le fichier config/database est défini comme suit (nom d'utilisateur, mot de passe, base de données modifiés pour protéger l'innocent):

module.exports = {
    'url': 'mongodb://azureusername:[email protected]:10255/?ssl=true'
}

Maintenant, le problème vient de l’installation de Mongoose 5.0.1. Je supprime l'option useMongoClient de la connexion et me débarrasse de la promesse. Mon code de connexion est maintenant:

mongoose.connect(configDB.url);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));

Quand cela fonctionne, j'obtiens ce qui suit dans la console:

(node: 21392) UnhandledPromiseRejectionWarning: promesse non gérée rejet (id de rejet: 2): Erreur: le mot de passe contient un illégal. personnage non échappé

Je peux même commenter le code de connexion à l'endroit où il ne s'agit que de mongoose.connect et c'est ce qui donne l'erreur. Qu'est-ce que je fais mal? Existe-t-il un changement radical dans la version 5.0.1 que je dois prendre en compte? En tant que note secondaire qui peut être liée ou non, j’ai vu quelques notes sur le rappel d’un rappel au lieu d’utiliser des promesses, donc si quelqu'un a un exemple de la façon dont il le fait dans une application Node/Express, ce serait génial, mais cela ne Je ne pense pas que c’est le cas lorsque je reçois une erreur signalée sur la connexion à propos d’un caractère illégal ..___. NOTE: le fichier de configuration est exactement le même lorsqu’il est exécuté avec 4.13.9 ou 5.0.1, je connais donc le mot de passe. est valide et ce n'est pas la question. 

8
Chris H

Pour la dernière version (v5.0.1) de Mongoose, vous devez utiliser cette syntaxe pour vous connecter à MongoDB comme ceci:

const mongoose = require('mongoose');

mongoose.connect('mongodb://<cosmosdb-username>.documents.Azure.com:10255/<databasename>?ssl=true', {
    auth: {
      user: '<cosmosdb-username>',
      password: '<cosmosdb-password>'
    }
  })
  .then(() => console.log('connection successful'))
  .catch((err) => console.error(err));
16
Aaron Chen

Le mot de passe de l'instance de base de données Azure Cosmos que j'ai terminée se termine par ==, d'où le message de caractères illégaux. Ces caractères doivent être codés en url.

Un signe égal = urlencodé est %3D.

Une chaîne de connexion correctement codée pour le mot de passe jitsu== pourrait ressembler à mongodb://user:jitsu%3D%3D@localhost:27017/dbname?ssl=false.

Sachez également que les chaînes de connexion que vous obtenez de la lame Cosmos DB dans le portail Azure n'incluent pas le nom de la base de données.

6
sshow

Pour vous connecter à l'émulateur de base de données cosmos local, utilisez la méthode de connexion suivante (pour les mangoustes> 5.0.0):

  mongoose.connect(

  `mongodb://localhost:10255/?ssl=true`,
  {
    auth: {
      user: "localhost",
      password: "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
      dbName: "admin"
    }
  }
);

Ou vous pouvez aussi faire ce qui suit:

const encodedPassword = encodeURIComponent("C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
mongoose.connect(`mongodb://localhost:${encodedPassword}@localhost:10255/admin?ssl=true`);

La chaîne de connexion a le format suivant:

mongodb: // nom d'utilisateur: mot de passe @ hôte: port/[base de données]? ssl = true

et il semble y avoir un problème avec l'échappement des caractères du mot de passe par défaut. Nous l'avons donc codé séparément.

1
Blaze