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 azuree à l’aide de CosmosDB et de l’API MongoDB. Mon application utilise mongoose 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, firebase database modifiés pour protéger l’innocent):

 module.exports = { 'url': 'mongodb://azureeusername:[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:')); 

Lorsque cela fonctionne, je reçois les informations suivantes dans la console:

(noeud: 21392) UnhandledPromiseRejectionWarning: Rejet d’une promesse non gérée (ID de rejet: 2): Erreur: Le mot de passe contient un caractère illégal 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 ou peut ne pas être liée, j’ai vu quelques notes sur le fait de donner 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 Il semble que ce ne soit pas le cas lorsque je reçois une erreur signalée sur la connexion à propos d’un personnage illégal. NOTE: Le fichier de configuration est exactement le même lors de l’exécution avec 4.13.9 ou 5.0.1, donc je sais que le mot de passe est valide et que ce n’est pas le problème.

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://.documents.azuree.com:10255/?ssl=true', { auth: { user: '', password: '' } }) .then(() => console.log('connection successful')) .catch((err) => console.error(err)); 

Le mot de passe de l’instance de firebase database Azure Cosmos avec laquelle je me suis terminé est == , d’où le message de caractères illégaux. Ces caractères doivent être codés en url.

Un signe égal = codé par url 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 à partir de la lame Cosmos DB dans le portail Azure n’incluent pas le nom de la firebase database.

Pour vous connecter à l’émulateur de firebase database cosmos local, utilisez la méthode de connexion suivante (pour les mongooses> 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 / [firebase database]? ssl = true

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