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)
ただし、ドキュメントではこの問題の解決方法についてはあまり説明されていません。エンコーディングの問題だと思います。これを修正する方法は?
@のような文字は、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();
});
_
受け入れられた答えは、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');
});
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();
});
実際、mongoDBとデータベースには別々のユーザー名があります。それらは異なるパスワードも持っています。