为啥 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