【问题标题】:Cannot connect to MongoDB in Azure无法连接到 Azure 中的 MongoDB
【发布时间】:2017-12-30 00:08:18
【问题描述】:

我在 Azure 上有一个 MongoDB,我正在尝试使用 npm 模块 mongodb 连接到它:

var mongoClient = require("mongodb").MongoClient;
mongoClient.connect("mongodb://myuser:mypassword@myhost.documents.azure.com: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)

但是文档并没有详细说明如何解决此问题。我想这是一个编码问题。如何解决这个问题?

【问题讨论】:

    标签: javascript node.js mongodb azure


    【解决方案1】:

    @ 这样的字符会受到限制,因为它们会破坏 URL 的结构。 这样做的原因是因为 MongoDB 将其解释为 @ 分隔符。而不是这个:

    var mongoClient = require("mongodb").MongoClient;
    mongoClient.connect("mongodb://myuser:myp@ssword@myhost.documents.azure.com:10355/?ssl=true", function (err, db) {
      db.close();
    });
    

    使用这个

    mongoClient.connect("mongodb://myuser:myp%40ssword@myhost.documents.azure.com: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();
    });
    

    【讨论】:

    • 谢谢!我看到了这种结构,但是在使用另一个库连接到 mongo 的帖子中,所以我认为 mongodb API 不支持它!非常感谢
    • 编辑:我编辑了帖子-测试后发现语法错误:(
    • 请考虑在您的答案中输入以前的语法。它确实对我有用。为什么要删除它?
    • 当然可以。
    • Don't work with package mongodb version > 3.0.0 see my answer
    【解决方案2】:

    接受的答案在 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'); 
    });
    

    【讨论】:

      【解决方案3】:

      MongoDB 现在可以使用带有特殊字符的密码。为此,请向连接{ useNewUrlParser: true } 添加一个选项:

      const MongoClient = require('mongodb').MongoClient;
      const assert = require('assert');
      
      const uri = 'mongodb://mydbname:pa$s;w@rd@mongodb0.example.com:27017/admin';
      
      MongoClient.connect(uri, { useNewUrlParser: true }, (err, db) => {
          assert.strictEqual(null, err);
          // ...
          db.close();
      });
      

      【讨论】:

        【解决方案4】:

        实际上,mongoDB 和数据库有一个单独的用户名..他们也有不同的密码..所以,请确保你有

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-01
          • 2016-07-31
          • 1970-01-01
          • 2019-10-31
          • 2013-07-27
          相关资源
          最近更新 更多