连接到Azure时出错:使用mongoose 5.0.1在密码中出现非法字符,但在4.13.9

时间:2018-01-24 15:00:31

标签: node.js mongodb mongoose azure-cosmosdb

我有一个使用CosmosDB和MongoDB API部署到azure的node.js应用程序。我的应用程序使用mongoose,它在4.13.9中无缝运行。

我的应用程序连接如下:

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:'));

config / database文件定义如下(更改用户名,密码,DB以保护无辜):

module.exports = {
    'url': 'mongodb://azureusername:azurepassword@myazuredb.documents.azure.com:10255/?ssl=true'
}

现在,当我安装mongoose 5.0.1时会出现问题。我从连接中删除了useMongoClient选项并删除了promise,所以我的连接代码现在是:

mongoose.connect(configDB.url);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));

当这个运行时,我在控制台中得到以下内容:

  

(node:21392)UnhandledPromiseRejectionWarning:未处理的承诺   rejection(拒绝id:2):错误:密码包含非法   未转义的角色

我甚至可以将连接代码注释到只有mongoose.connect的地方,这就是给出错误的原因。我究竟做错了什么?我需要考虑5.0.1中的重大变化吗?作为一个可能相关或不相关的附注,我看到一些关于现在给出回调而不是使用promises的注释,所以如果有人在Node / Express应用程序中有一个如何做到这一点的例子,那将是很好的,但它没有当我在连接上报告关于非法字符的错误时,我觉得这就是isee。 注意:运行4.13.9或5.0.1时配置文件完全相同所以我知道密码有效,这不是问题。

4 个答案:

答案 0 :(得分:16)

对于Mongoose的最新版本(v5.0.1),您需要使用此语法连接到MongoDB,如下所示:

const mongoose = require('mongoose');

mongoose.connect('mongodb://<cosmosdb-username>.documents.azure.com:10255/<databasename>?ssl=true', {
    auth: {
      user: '<cosmosdb-username>',
      password: '<cosmosdb-password>'
    }
  })
  .then(() => console.log('connection successful'))
  .catch((err) => console.error(err));

答案 1 :(得分:7)

我以==结束的Azure Cosmos数据库实例的密码,因此是非法字符消息。这些字符必须是urlencoded。

urlencoded的等号=%3D

密码jitsu==的正确编码连接字符串可能看起来像mongodb://user:jitsu%3D%3D@localhost:27017/dbname?ssl=false

另请注意,您从Azure门户中的Cosmos DB刀片获取的连接字符串不包含数据库名称。

答案 2 :(得分:1)

要连接到本地cosmos db模拟器,请使用以下连接方法(对于mongoose&gt; 5.0.0):

never

或者您也可以执行以下操作:

f(undefined); // still works
f(""); // still error, "" is not assignable to undefined

declare var x: any;
f(x); // now error, any is not assignable to never

连接字符串具有以下格式:

的mongodb://用户名:密码@主机:端口/ [数据库] SSL =真

并且似乎存在默认密码字符转义的问题。因此我们将其单独编码。

答案 3 :(得分:0)

将新的网址解析器添加为选项{ useNewUrlParser: true }

将第3行更改为:

mongoose.connect(configDB.url, { useMongoClient: true, useNewUrlParser: true } );