为啥 MongoDB 无法连接到我的 NodeJS 应用程序?

Posted

技术标签:

【中文标题】为啥 MongoDB 无法连接到我的 NodeJS 应用程序?【英文标题】:Why can't MongoDB connect to my NodeJS app?为什么 MongoDB 无法连接到我的 NodeJS 应用程序? 【发布时间】:2020-06-26 20:33:14 【问题描述】:

在 nodejs 服务器中,mongodb 没有连接。终端上显示的错误代码

[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
Server started on port 5000
MongoParseError: URI does not have hostname, domain name and tld
    at parseSrvConnectionString (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongodb/lib/core/uri_parser.js:41:21)
    at parseConnectionString (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongodb/lib/core/uri_parser.js:516:12)
    at connect (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongodb/lib/operations/connect.js:266:3)
    at ConnectOperation.execute (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongodb/lib/operations/connect.js:191:5)
    at executeOperation (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongodb/lib/operations/execute_operation.js:83:26)
    at MongoClient.connect (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongodb/lib/mongo_client.js:216:10)
    at /home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongoose/lib/connection.js:632:12
    at new Promise (<anonymous>)
    at NativeConnection.Connection.openUri (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongoose/lib/connection.js:629:19)
    at Mongoose.connect (/home/psayeed1990/programming/node/node_passport_login-master/node_modules/mongoose/lib/index.js:328:15)
    at Object.<anonymous> (/home/psayeed1990/programming/node/node_passport_login-master/app.js:18:4)
    at Module._compile (internal/modules/cjs/loader.js:1128:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
    at Module.load (internal/modules/cjs/loader.js:983:32)
    at Function.Module._load (internal/modules/cjs/loader.js:891:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) 
  name: 'MongoParseError',
  [Symbol(mongoErrorContextSymbol)]: 

这是连接代码

dbPassword = 'mongodb+srv://sayeed:'+ encodeURIComponent('123456') + 'mongodb://localhost:27017/node-passport-login';

module.exports = 
    mongoURI: dbPassword
;

完整的 nodejs 应用取自 Traversy Media 的 github 页面 Node Passport Login。

【问题讨论】:

去掉+srv会变成mongodb://localhost:27017; srv 正在为集群 mongodb 寻找 tld。 【参考方案1】:

就我而言,我在密码字符串的末尾有“*”和“#”。我也不想使用自动生成的密码。

之前:

password*#

之后:

password%2A%23

您可以使用在线工具对您的密码进行 url 编码

https://www.url-encode-decode.com/

【讨论】:

【参考方案2】:

我也遇到过这个问题,我使用自动生成密码更新了我的密码, 它对我有用。

EXAMPLE

If your password in plain-text is p@ssw0rd'9'!, you would need to encode your password as:

p%40ssw0rd%279%27%21

https://docs.atlas.mongodb.com/troubleshoot-connection/#special-characters-in-connection-string-password

【讨论】:

【参考方案3】:

您提供的 mongodb 连接 url 不正确,在您的情况下是 dbPassword。 如果要连接到本地托管的 mongodb 数据库,请执行以下操作。

在终端中启动 mongod,然后像这样将 dbPassword 更改为本地 url

dbPassword="mongodb://localhost:27017/dbName"

或者你可以像这样直接在 app.js 中使用 url

mongoose.connect("mongodb://localhost:27017/dbName")

如果这不是您想要的,并且您想做 Brad 所做的事情,即连接到云数据库,您需要首先在 mongodb 云上创建一个帐户,登录然后创建一个集群,之后您需要复制网址。

在我看来,使用本地 mongodb 服务器更容易。 一旦您希望部署您的应用程序,您只需要云数据库。

【讨论】:

非常感谢。我有一个 ec2 实例,想用 nginx 和域名将它部署在那里。那么您提供的网址会为此工作吗?为什么我不需要本地数据库的用户名和密码?它在生产级别是否安全? 我想在 ec2 实例中本地使用 MongoDB。 我假设您使用的是 mongodb 云提供的免费层。如果是这种情况,那么只需登录您的帐户account.mongodb.com/account/login,然后单击连接,然后单击连接您的应用程序,您将看到连接字符串,只需复制粘贴并将密码部分替换为您的 mongodb 云密码你应该很高兴 我的意思是我已经在 ec2 实例中安装了 mongodb。然后在那里上传我的节点应用程序后,我必须连接数据库。您提供的字符串工作正常。

以上是关于为啥 MongoDB 无法连接到我的 NodeJS 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes node.js 容器无法连接到 MongoDB Atlas

Mongodb/NodeJS 连接到 localhost SQL

连接到 mongoDB

连接到 mongoDB

如何将nodeJS docker容器连接到mongoDB

我一直在尝试将我的节点连接到 MongoDB,但我遇到了错误