未处理的承诺拒绝:错误:URL 格式错误,无法解析

Posted

技术标签:

【中文标题】未处理的承诺拒绝:错误:URL 格式错误,无法解析【英文标题】:Unhandled promise rejection: Error: URL malformed, cannot be parsed 【发布时间】:2018-11-08 10:43:36 【问题描述】:

我同时是 aws 和 mongodb 的新手,所以我在尝试连接到托管在 amazon linux ec2 实例上的我的 mongo 数据库时遇到了一个非常基本的问题。原因是,我无法为我的数据库构建路径。

这是我正在尝试使用的:

mongoose.connect('mongod://ec2-user@ec2-XX-XX-XXX-XXX-XX.compute-1.amazonaws.com:27017/test' )

这是我测试 lambda 函数的结果:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: URL malformed, cannot be parsed

我使用的是 mongodb 3.6.5。

【问题讨论】:

【参考方案1】:

Mongoose 5.x 支持以下授权语法,并确保您没有在 url 中使用任何特殊字符,例如 @,-,+,>

mongoose.connect(MONGO_URL, 
  auth: 
    user: MONGO_DB_USER,
    password: MONGO_DB_PASSWORD
  
)

或者如果您想删除贬损警告避免“当前 URL 字符串解析器已弃用”

添加选项useNewUrlParser

mongoose.connect(MONGO_URL, 
  auth: 
    user: MONGO_DB_USER,
    password: MONGO_DB_PASSWORD
  ,
   useNewUrlParser: true 
)

【讨论】:

对我来说,使用 Mongoose 5.6.11,只需删除密码字符串中的特殊字符(即 +? @samurai_jane Mongoose 5.6.11 支持 connection string 以及上述 option 语法。但是如果用户名和密码包含特殊字符,上述语法将是有益的。【参考方案2】:

我的问题是一个更简单的 URI 问题。由于 mongod 地址中有一个@ 字符。

我不得不使用这个:

return mongoose.connect(encodeURI(process.env.DB_CONNECT)); //added ');'

【讨论】:

对我不起作用:获取MongoParseError: Unescaped at-sign in authority section encodeURI(process.env.DB_CONNECT)的console.log的输出是什么? 其实这最终解决了我的问题。它最初没有解析的原因是我在我的db-user 名称中使用了“@”符号(误认为是 mLab 帐户名称)。抱歉! 尝试这个后,我得到MongoParseError: Invalid connection string【参考方案3】:

例如,如果您在环境文件中使用了以下 URI MongoDB://<dbuser>:<dbpassword>@ds055915.mlab.com:55915/fullstack-vue-graphql 确保MONGOD_URI 中的密码没有像@ 这样的特殊字符。我曾将@ 用作我的密码字符的一部分,但遇到了错误。从DB Password 中删除特殊字符后,一切都按预期工作。

【讨论】:

【参考方案4】:

在我的情况下,以下工作正常。

内部db.js

const mongoose = require('mongoose');
const MONGODB_URI = "mongodb://host-name:27017/db-name?authSource=admin";
const MONGODB_USER = "mongouser";
const MONGODB_PASS = "myasri*$atIP38:nG*#o";

const authData =  
    "user": MONGODB_USER,
    "pass": MONGODB_PASS,
    "useNewUrlParser": true,
    "useCreateIndex": true
; 
mongoose.connect(
    MONGODB_URI, 
    authData,
    (err) => 
        if (!err)  console.log('MongoDB connection succeeded.'); 
        else  console.log('Error in MongoDB connection : ' + JSON.stringify(err, undefined, 2)); 
    
);

注意:

我的 Node 版本是 10.x

MongoDb 服务器版本为 3.6.3

猫鼬版本是^5.1.2

【讨论】:

【参考方案5】:

我只想从@anthony-winzlet 更新答案,因为我有同样的错误,我已经用这段代码解决了。

mongoose.connect(url, 
  auth: 
    user:'usrkoperasi',
    password:'password'
  ,
  useNewUrlParser:true
, function(err, client) 
  if (err) 
    console.log(err);
  
  console.log('connect!!!');
);

我只是添加回调和useNewUrlParser:true。我用"mongoose": "^5.2.7",

编码愉快!

【讨论】:

【参考方案6】:

如果您将应用部署到 Heroku,请确保更新了 Config Vars,因为它们在您的 .env 文件中。至少,这是我的情况。

【讨论】:

【参考方案7】:

我有同样的问题,但密码有问题 不应该是特殊字符

password not use like this  Admin@%+admin.com wrong


password use like this  Admin  right

或您想使用的任何密码

【讨论】:

以上是关于未处理的承诺拒绝:错误:URL 格式错误,无法解析的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 机器人“未处理的承诺拒绝类型错误:无法读取未定义的属性 255890520990154752”

条纹元素抛出“未处理的承诺拒绝”

反应本机中未处理的承诺拒绝错误?

无法读取未定义和未处理的承诺拒绝的属性“捕获”

可能未处理的承诺拒绝/错误:请求失败,状态码为 400

*可能的未处理承诺拒绝(id:0):类型错误:未定义不是对象(评估'result.cancelled')云图像上传