【问题标题】:Deployed app on Heroku, but can't access mongoDB from it在 Heroku 上部署了应用程序,但无法从中访问 mongoDB
【发布时间】:2022-08-14 23:50:24
【问题描述】:

我在 Heroku 上部署了我的第一个 MERN 堆栈应用程序,它基本上是一个酒类库存管理器。

但是它无法访问数据库。每当我拨打 Axios 电话时,我的请求都会被拒绝。我今天浪费了 7 个小时试图修复它,但无济于事。任何帮助表示赞赏。

这是我的 server.js

const express = require(\'express\')
const dotenv = require(\'dotenv\').config()
const connectDB = require(\'./config/db\')
const {errorHandler} = require(\'./middleware/errorMiddleware\')
const port = process.env.PORT || 5000
const app = express()
const path = require(\'path\')
const cors = require(\'cors\')
const mongoose = require(\'mongoose\')

connectDB()

app.use(express.json());
app.use(cors());

app.use(\'/api/users\', require(\'./routes/userRoutes\'))
app.use(\'/api/inventory\', require(\'./routes/inventoryRoutes\'))
app.use(\'/api/weekly\', require(\'./routes/weeklyRoutes\'))

mongoose.connect( process.env.MONGODB_URI, { useNewUrlParser: true })

// Serve frontend
if (process.env.NODE_ENV === \'production\') {
    app.use(express.static(path.join(__dirname, \'../frontend/build\')))
  
    app.get(\'*\', (req, res) =>
      res.sendFile(
        path.resolve(__dirname, \'../\', \'frontend\', \'build\', \'index.html\')
      )
    )
  } else {
    app.get(\'/\', (req, res) => res.send(\'Please set to production\'))
  }
app.use(errorHandler)

app.listen(port, () => {
    console.log(`Server up on ${port}`)
})

这是我的 package.json

{
  \"name\": \"stockify-inventory-manager\",
  \"version\": \"1.0.0\",
  \"description\": \"Manage your Alcohol Inventory easily\",
  \"main\": \"server.js\",
  \"scripts\": {
    \"start\": \"node backend/server.js\",
    \"server\": \"nodemon backend/server.js\",
    \"client\": \"npm start --prefix frontend\",
    \"dev\": \"concurrently \\\"npm run server\\\" \\\"npm run client\\\"\",
    \"heroku-postbuild\": \"NPM_CONFIG_PRODUCTION=false npm install --prefix frontend && npm run build --prefix frontend\"
  },
  \"author\": \"Steve Yoo\",
  \"license\": \"MIT\",
  \"dependencies\": {
    \"bcryptjs\": \"^2.4.3\",
    \"bootstrap\": \"^5.1.3\",
    \"colors\": \"^1.4.0\",
    \"cors\": \"^2.8.5\",
    \"dotenv\": \"^16.0.0\",
    \"express\": \"^4.17.3\",
    \"express-async-handler\": \"^1.2.0\",
    \"font-awesome\": \"^4.7.0\",
    \"jsonwebtoken\": \"^8.5.1\",
    \"mongoose\": \"^6.2.3\",
    \"react-router-dom\": \"^6.2.1\"
  }
}

以下是我尝试过的清单:

  1. mongoDB 上的白名单 IP 为 0.0.0.0/0
  2. 仔细检查来自 mongoDB 的连接字符串及其在 .env 中的设置方式
  3. 检查是否有任何项目卡在开发依赖项而不是依赖项中
  4. 仔细检查我的 Heroku 配置变量并确保它们匹配 .env
  5. 将 nodejs 更新到最新版本

    是的,这在本地运行良好。

    编辑:在 heroku local 上测试一些东西时,我注意到在本地运行的后端会导致部署的应用程序按预期工作。但是,一旦我终止本地,它就无法再次访问数据库。似乎后端在部署时甚至没有开始运行。仍然没有线索....任何帮助表示赞赏

    EDIT2:添加错误截图。enter image description here

    标签: javascript mongodb heroku mongoose mern


    【解决方案1】:

    我认为错误屏幕截图在这里会有很大帮助,'因为我不知道你得到什么样的错误,你说你无法连接到数据库尝试将您的 Heroku 域添加到 MongoDB Allowed Domains.

    另外,我看到您在heroku-postbuild 脚本中使用了npm install,但您不必这样做,因为每当您将代码推送到heroku 时,它会自动运行npm install

    【讨论】:

    • 嗨,我刚刚添加了错误截图。检查编辑#2。当我使用 0.0.0.0/0 将任何访问列入白名单时,这有关系吗?
    • 我想错误屏幕截图来自您的应用程序的生产版本。那你为什么要求本地主机:5000.我看到了您的代码,并且在您的 Axios API 调用中您使用的是 http://localhost:5000,这是您无法做到的。这正是给你一个错误的原因。所以你可以使用这样的东西...... axios.post('/api/inventory')
    • 哦,我的上帝,你是绝对正确的,我将部署它并尝试一下。
    • 有效!谢谢好心的先生,你拯救了我的一天。祝你晚安。
    • 您的欢迎好友。并且不要忘记将此答案标记为正确答案。
    【解决方案2】:

    我遇到了类似的问题,但是如果您在 mongodb atlas 上使用 0.0.0.0/0 将 IP 列入白名单,这意味着任何人都可以访问您的数据库并使用它做他们想做的事。那是我的问题,除非我将网络访问设置为“从任何地方允许”,否则 Heroku 服务器将无法连接到 mongodb atlas,并且您无法在生产中执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-05
      • 2023-01-22
      • 2020-04-07
      • 2016-06-23
      • 2013-08-22
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多