Node.js 连接Azure时出错:mongoose 5.0.1的密码中包含非法字符,但在4.13.9中有效

Node.js 连接Azure时出错:mongoose 5.0.1的密码中包含非法字符,但在4.13.9中有效,node.js,mongodb,mongoose,azure-cosmosdb,Node.js,Mongodb,Mongoose,Azure Cosmosdb,我有一个node.js应用程序,它使用CosmosDB和MongoDB API部署到azure。我的应用程序使用mongoose,它在4.13.9中无缝工作 我的应用程序的连接方式如下: var configDB = require('./config/database'); var mongoose = require('mongoose'); mongoose.connect(configDB.url, { useMongoClient: true } ); mongoose.Promise

我有一个node.js应用程序,它使用CosmosDB和MongoDB API部署到azure。我的应用程序使用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:'));
配置/数据库文件的定义如下(更改用户名、密码、数据库以保护用户):

现在,当我安装mongoose 5.0.1时,问题来了。我从连接中删除了useMongoClient选项,并取消了承诺,因此我的连接代码现在是:

mongoose.connect(configDB.url);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));
运行此命令时,控制台中会显示以下内容:

(节点:21392)未处理的PromisejectionWarning:未处理的承诺 拒绝(拒绝id:2):错误:密码包含非法密码 未经修饰的人物

我甚至可以注释掉连接代码,它只是mongoose.connect,这就是导致错误的原因。我做错了什么?5.0.1中是否有需要说明的突破性变化?作为一个可能相关也可能无关的旁注,我看到了一些关于现在进行回调而不是使用承诺的说明,因此如果有人在Node/Express应用程序中有这样做的示例,那将非常好,但当我在connect上收到关于非法字符的错误报告时,这似乎不是isee。 注意:在运行4.13.9或5.0.1时,配置文件完全相同,因此我知道密码是有效的,这不是问题所在

对于最新版本(v5.0.1)的Mongoose,您需要使用以下语法连接到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));
const mongoose=require('mongoose');
猫鼬mongodb://.documents.azure.com:10255/?ssl=true', {
认证:{
用户:“”,
密码:“”
}
})
。然后(()=>console.log('connection successful'))
.catch((err)=>console.error(err));

我得到的Azure Cosmos DB实例的密码以
=
结尾,因此出现了非法字符消息。这些字符必须进行URL编码

等号
=
urlencoded是
%3D

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


还要注意,从Azure门户中的Cosmos DB blade获取的连接字符串不包括数据库名称。

要连接到本地Cosmos DB emulator,请使用以下连接方法(对于mongoose>5.0.0):

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

const encodedPassword = encodeURIComponent("C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
mongoose.connect(`mongodb://localhost:${encodedPassword}@localhost:10255/admin?ssl=true`);
连接字符串具有以下格式:

mongodb://username:password@主机:端口/[数据库]?ssl=true


默认密码字符转义似乎存在一些问题。因此,我们分别对其进行了编码。

添加新的url解析器作为选项
{useNewUrlParser:true}

将第3行更改为:

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

您从何处获取cosmosDB用户名?在门户中,您应该能够从Cosmos DB帐户的连接字符串页面获取名称。我想这只是帐户名。你不必这么做。您只需对您的凭证进行URL编码。有关详细信息,请参阅。
const encodedPassword = encodeURIComponent("C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
mongoose.connect(`mongodb://localhost:${encodedPassword}@localhost:10255/admin?ssl=true`);
mongoose.connect(configDB.url, { useMongoClient: true, useNewUrlParser: true } );