web-dev-qa-db-fra.com

Impossible de se connecter à MongoDB dans Azure

J'ai une MongoDB sur Azure et j'essaie de me connecter à l'aide du module npm mongodb :

var mongoClient = require("mongodb").MongoClient;
mongoClient.connect("mongodb://myuser:[email protected]:10355/?ssl=true", function (err, db) {
  db.close();
});

Mot de passe

Mon mot de passe a les caractéristiques suivantes:

  • Contient des lettres, minuscules, majuscules
  • Pas d'espace blanc
  • Contient des chiffres
  • Contient des caractères spéciaux tels que =, @, $ et ainsi de suite

Erreur

Je reçois ce qui suit lors de l'exécution du code ci-dessus:

Error: Password contains an illegal unescaped character
    at parseConnectionString (C:\Users\myuser\Documents\myproj\node_modules\mongodb\lib\url_parser.js:280:13)

Cependant, la documentation ne dit pas grand chose sur la façon de résoudre ce problème. Je suppose que c'est un problème d'encodage. Comment régler ceci?

9
Andry

Des caractères comme @ sont restreints car ils bousillent la structure de l'URL. La raison en est que MongoDB l’interprète comme le séparateur @. Au lieu de cela:

var mongoClient = require("mongodb").MongoClient;
mongoClient.connect("mongodb://myuser:myp@[email protected]:10355/?ssl=true", function (err, db) {
  db.close();
});

utilisez ceci

mongoClient.connect("mongodb://myuser:myp%[email protected]:10355/?ssl=true", { 
  uri_decode_auth: true 
}, function (err, db) {
  db.close();
});

Pour encoder le mot de passe, utilisez encodeURIComponent(password)

Vous pouvez également utiliser cette syntaxe.

mongoClient.connect("mongodb://myhost.documents.Azure.com:10355/?ssl=true", 
 {user: 'username', pass: 'p@ssword'}, function (err, db) {
  db.close();
});

Sur les versions ultérieures, utilisez

auth: {
       user: 'username',
       password: 'p@ssword',
    }

comme ci-dessous

mongoClient.connect("mongodb://myhost.documents.Azure.com:10355/?ssl=true", {
  auth: {
   user: 'username',
   password: 'p@ssword',
  }}, function (err, db) {
  db.close();
});
16
Solver

La réponse acceptée ne fonctionne pas pour moi sur mongodb> 3.0.x

Ce code fonctionne pour moi:

const mongoClient = require("mongodb").MongoClient;

let database = null;


new mongoClient('mongodb://myhost.documents.Azure.com:10355/?ssl=true', {
    auth: {
       user: 'username',
       password: 'p@ssword',
    }
}).connect(
    (err, db) => {
      if (err) return console.error(err);
      console.log('Database connected');
      database = db.db('foo'); 
});
2
Guillaume Alouege

En fait, il existe un nom d'utilisateur distinct pour mongoDB et pour une base de données..ils ont un mot de passe différent 

0
Mano Sriram

MongoDB peut maintenant utiliser un mot de passe avec des caractères spéciaux. Pour ce faire, ajoutez une option à la connexion { useNewUrlParser: true }:

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

const uri = 'mongodb://mydbname:pa$s;w@[email protected]:27017/admin';

MongoClient.connect(uri, { useNewUrlParser: true }, (err, db) => {
    assert.strictEqual(null, err);
    // ...
    db.close();
});
0
Eugene Gubar