簡體   English   中英

無法在部署中連接到 MongoDb (Heroku):連接 ECONNREFUSED 127.0.0.1:27017

[英]Can´t connect to MongoDb in deployment (Heroku): connect ECONNREFUSED 127.0.0.1:27017

我的應用程序在本地運行良好,但服務器(連接到數據庫)在 Heroku 上部署時無法正常運行。

通過閱讀日志並在 SO 中沖浪,我認為是因為以下行:

mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/shareable-todo-new')
    .then((res) => console.log(res)).catch((err) => console.log(err));

我的 package.json :

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node ./app.js",
"dev": "nodemon ./app.js",
"heroku-postbuild":"NPM_CONFIG_PRODUCTION=false npm install --prefix front && npm run build --prefix front"
},

嘗試在我的 package.json 中添加它,但沒有幫助:

 "heroku config":"set NPM_CONFIG_PRODUCTION=true"

我的 app.js :

 const express = require('express') const https = require('https') const app = express(); const bodyParser = require('body-parser') const mongoose = require('mongoose') const path = require('path') const routerLists = require('./routes/lists'); const routerTasks = require('./routes/tasks') const routerUsers = require('./routes/users') mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/shareable-todo-new', { useNewUrlParser: true, useUnifiedTopology: true }) .then((res) => console.log(res)).catch((err) => console.log(err)); // fix a deprecated bugs mongoose.set('useCreateIndex', true); mongoose.set('useFindAndModify', false); mongoose.Promise = global.Promise; // Serve static assets if In Production: app.use(bodyParser.json()) app.use('/api', routerLists) app.use('/api', routerTasks) app.use('/api', routerUsers) if(process.env.NODE_ENV === 'production'){ // set static folder: app.use(express.static(path.join(__dirname, "front/build"))) app.get("*", (req,res) => { res.sendFile(path.resolve(__dirname, 'front', 'build', 'index.html')) }) } app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); // middleware para admitir errores: app.use((err,res) => { res.status(422).send({ error: err.message }) }) app.listen(process.env.PORT || 4000, () => console.log('express listening now...'))

如果有任何幫助,當我嘗試執行 POST 請求時,chrome 控制台會給出錯誤 500

引用 127.0.0.1(或 localhost)表示您的本地機器。 在 Heroku 上運行應用程序時,127.0.0.1 是不包含 MongoDB 實例的 Heroku 機器。 您應該使用外部服務器來托管 MongoDB,例如https://mlab.com/

將 MongoDB 部署到服務器后,將環境變量 (MONGODB_URI) 設置為適當的值

當您在本地 PC(localhost 或 127.0.0.1)上開發和測試時,您的代碼、開發環境、服務器和 MongoDB 實例都在本地端口 27017(或任何其他端口)上設置。 但是當您將代碼部署到 Heroku 並嘗試運行您的應用程序時,Heroku 肯定會拋出某種錯誤,因為它尚未在服務器(即 .herokuapp.com)上配置任何 MongoDB 實例。 如果你能找到一種方法來創建一個非常困難的實例,那就太好了。

最好的推薦方法是將您的應用程序連接到 MongoDB 雲。 正如 Oleksandr 在上面的回答中所說,您必須在 mlab 或 MongoDB Atlas 上創建一個帳戶。

將以下代碼片段放在包含啟動服務器代碼的 javascript 文件中。

 //the following URL will be provided once you create an account on MongoDB Atlas and create //a cluster. mongoose.connect(`mongodb+srv://<database_user_name>:<password>@cluster.address/<db_name>?retryWrites=true&w=majority`,{ useNewUrlParser:true, useUnifiedTopology:true //this line is not mandatory }).then(()=>{ console.log('Connected to MongoDB Cloud :)'); })//catch errors if you want.

如果您從 localhost:port 在 MongoDB 雲上開發和進行 CRUD 操作,其他 CRUD 操作應該可以正常工作並確保您有良好的互聯網連接。

那應該有幫助! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM