web-dev-qa-db-ja.com

AzureのMongoDBに接続できません

AzureにMongoDBがあり、npmモジュールを使用して接続しようとしています mongodb

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

パスワード

パスワードには次の特徴があります。

  • 文字、小文字、大文字が含まれています
  • 空白なし
  • 数字が含まれています
  • =@$などの特殊文字が含まれています

エラー

上記のコードを実行すると、次のメッセージが表示されます。

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

ただし、ドキュメントではこの問題の解決方法についてはあまり説明されていません。エンコーディングの問題だと思います。これを修正する方法は?

11
Andry

@のよ​​うな文字は、URLの構造を台無しにするため制限されます。これは、MongoDBが@区切り文字として解釈するためです。これの代わりに:

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

これを使って

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

パスワードをエンコードするには、encodeURIComponent(password)を使用します

この構文を使用することもできます。

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

それ以降のバージョンでは、

_auth: {
       user: 'username',
       password: 'p@ssword',
    }
_

以下のように

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

受け入れられた答えは、mongodb> 3.0.xでは動作しません

このコードは私のために働く:

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

MongoDBは、特殊文字を含むパスワードを使用できるようになりました。これを行うには、接続にオプションを追加します{ 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();
});
1
Eugene Gubar

実際、mongoDBとデータベースには別々のユーザー名があります。それらは異なるパスワードも持っています。

0
Mano Sriram