如何将heroku服务器连接到mongodb?

yol*_*RAC 1 heroku mongodb node.js

初学者使用 Node.js 我在 Heroku 上部署服务器时遇到问题。

\n\n

我制作了一个使用 mongodb 的 server.js 应用程序。\n当我使用“npm start”cmd 在本地( http://localhost:3000 )上运行服务器时,它工作正常,我能够连接到我的mongo数据库通过命令:

\n\n
mongoose.connect(\n\'mongodb+srv://yolanpibrac:mypassword@cluster0-7z1th.mongodb.net/test?                        retryWrites=true&w=majority\';, \n{ useNewUrlParser: true })  \n
Run Code Online (Sandbox Code Playgroud)\n\n

(我遵循了本教程:[ https://appdividend.com/2018/04/14/how-to-deploy-nodejs-app-to-heroku/]

\n\n

但是当我在heroku上部署我的应用程序时,该应用程序无法连接到mongo db。我有以下错误(通过检查:heroku log -t):

\n\n
2019-08-06T21:06:33.086146+00:00 heroku[web.1]: Starting process with     command `node src/server.js`\n2019-08-06T21:06:35.404641+00:00 heroku[web.1]: State changed from     starting to up\n2019-08-06T21:06:35.058357+00:00 app[web.1]: Listening on port 26845\n2019-08-06T21:06:36.144056+00:00 app[web.1]: Error while DB connecting\n2019-08-06T21:06:36.149809+00:00 app[web.1]: { MongoNetworkError: failed     to connect to server [cluster0-shard-00-00-7z1th.mongodb.net:27017] on first     connect [MongoNetworkError: connection 5 to cluster0-shard-00-00-    7z1th.mongodb.net:27017 closed]\n2019-08-06T21:06:36.149812+00:00 app[web.1]: at Pool.<anonymous>     (/app/node_modules/mongodb-core/lib/topologies/server.js:431:11)\n2019-08-06T21:06:36.149814+00:00 app[web.1]: at Pool.emit     (events.js:189:13)\n2019-08-06T21:06:36.149815+00:00 app[web.1]: at connect     (/app/node_modules/mongodb-core/lib/connection/pool.js:557:14)\n2019-08-06T21:06:36.149816+00:00 app[web.1]: at callback     (/app/node_modules/mongodb-core/lib/connection/connect.js:109:5)\n2019-08-06T21:06:36.149818+00:00 app[web.1]: at runCommand     (/app/node_modules/mongodb-core/lib/connection/connect.js:129:7)\n2019-08-06T21:06:36.149819+00:00 app[web.1]: at Connection.errorHandler     (/app/node_modules/mongodb-core/lib/connection/connect.js:321:5)\n2019-08-06T21:06:36.149820+00:00 app[web.1]: at Object.onceWrapper     (events.js:277:13)\n2019-08-06T21:06:36.149821+00:00 app[web.1]: at Connection.emit     (events.js:189:13)\n2019-08-06T21:06:36.149823+00:00 app[web.1]: at TLSSocket.<anonymous>     (/app/node_modules/mongodb-core/lib/connection/connection.js:350:12)\n2019-08-06T21:06:36.149824+00:00 app[web.1]: at Object.onceWrapper     (events.js:277:13)\n2019-08-06T21:06:36.149825+00:00 app[web.1]: at TLSSocket.emit     (events.js:189:13)\n2019-08-06T21:06:36.149826+00:00 app[web.1]: at _handle.close     (net.js:613:12)\n2019-08-06T21:06:36.149828+00:00 app[web.1]: at TCP.done     (_tls_wrap.js:386:7)\n2019-08-06T21:06:36.149829+00:00 app[web.1]: name: \'MongoNetworkError\',\n2019-08-06T21:06:36.149830+00:00 app[web.1]: errorLabels: [     \'TransientTransactionError\' ],\n2019-08-06T21:06:36.149832+00:00 app[web.1]:     [Symbol(mongoErrorContextSymbol)]: {} }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经阅读了与此问题相关的所有问题,但没有一个解决方案有效。\n我有带有集群连接字符串的 mongodb 帐户\n我在密码中小心翼翼地确保所有特殊字符均经过 URL 编码。\n我有一个 procfile : web: 节点src/server.js 和一个index.html 文件

\n\n

我的 server.js 文件:

\n\n
//D\xc3\xa9finition des modules\nconst express = require("express");\nconst mongoose = require("mongoose");\nconst bodyParser = require(\'body-parser\');\nconst app = express();\nconst path = require(\'path\');\n\n\n\nconst dbRoute = \'mongodb+srv://yolanpibrac:mypassword@cluster0-    7z1th.mongodb.net/test?retryWrites=true&w=majority\';\nconst dbRouteLocal = \'mongodb://localhost/db\';\n//Connexion \xc3\xa0 la base de donn\xc3\xa9e\nmongoose.connect(dbRoute, { useNewUrlParser: true }).then(() => {\n    console.log(\'Connected to mongoDB\')\n}).catch(e => {\n    console.log(\'Error while DB connecting\');\n    console.log(e);\n});\n\n\n\nvar urlencodedParser = bodyParser.urlencoded({\n    extended: true\n});\napp.use(urlencodedParser);\napp.use(bodyParser.json({limit: \'10mb\', extended: true}));\n\n//D\xc3\xa9finition des CORS\napp.use(function (req, res, next) {\n    res.setHeader(\'Access-Control-Allow-Headers\', \'Origin,X-Requested-    With,content-type,Accept,content-type,application/json\');\n    res.setHeader(\'Access-Control-Allow-Origin\', \'*\');\n    res.setHeader(\'Access-Control-Allow-Methods\', \'GET, POST, OPTIONS,     PUT, PATCH, DELETE\');\n    res.setHeader(\'Access-Control-Allow-Credentials\', true);\n    next();\n});\n\n\n\nvar router = express.Router();\napp.use(\'/user\', router);\nrequire(__dirname + \'/controllers/userController\')(router);\n\n\napp.get(\'/\', function(req, res) {\n    res.sendFile(path.join(__dirname, \'index.html\'));\n});\napp.get(\'*\', function(req, res) {\n    res.sendFile(path.join(__dirname, \'index.html\'));\n});\n\n//D\xc3\xa9finition et mise en place du port d\'\xc3\xa9coute\nvar port = process.env.PORT || "3000";\n\napp.listen(port, () => console.log(`Listening on port ${port}`));\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 package.json :

\n\n
{\n  "name": "movies-displayer",\n  "version": "0.1.0",\n  "engines": {\n    "node": "11.4.0"\n  },\n  "private": true,\n  "proxy": "http://yolan-pibrac.com",\n  "dependencies": {\n    "animated": "^0.2.2",\n    "axios": "^0.19.0",\n    "body-parser": "^1.19.0",\n    "bootstrap": "^4.3.1",\n    "express": "^4.17.1",\n    "jwt-simple": "^0.5.6",\n    "mongodb": "^3.3.0-beta2",\n    "mongoose": "^5.6.8",\n    "password-hash": "^1.2.2",\n    "react": "^16.8.6",\n    "react-activity": "^1.2.2",\n    "react-animations": "^1.0.0",\n    "react-bootstrap": "^0.32.1",\n    "react-bootstrap-dropdown-menu": "^1.1.15",\n    "react-dom": "^16.8.6",\n    "react-multi-carousel": "^2.1.2",\n    "react-popper": "^1.3.3",\n    "react-pose": "^4.0.8",\n    "react-redux": "^7.0.3",\n    "react-router": "^4.3.1",\n    "react-router-dom": "^4.3.1",\n    "react-scripts": "3.0.1",\n    "react-state-animation": "^0.1.0",\n    "reactstrap": "^8.0.1",\n    "redux": "^4.0.1",\n    "styled-components": "^4.3.2"\n  },\n  "scripts": {\n    "start": "node src/server.js"\n  },\n  "eslintConfig": {\n    "extends": "react-app"\n  },\n  "browserslist": {\n    "production": [\n      ">0.2%",\n      "not dead",\n      "not op_mini all"\n    ],\n    "development": [\n      "last 1 chrome version",\n      "last 1 firefox version",\n      "last 1 safari version"\n    ]\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果需要,我可以提供更多详细信息!\n感谢您的帮助,

\n

Shm*_*uer 5

您可能需要允许 heroku 访问您的 mongodb 服务器。

您可以通过登录Mongodb atlas并单击左侧安全设置下的网络访问来实现此目的,然后单击右上角的添加IP地址并输入0.0.0.0/0作为IP地址以允许所有IP的访问或者添加你的​​heroku服务器的特定IP(如果可以的话)。