我有一个使用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时配置文件完全相同所以我知道密码有效,这不是问题。
答案 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 } );