部署 MERN 应用程序后,Heroku 无法从数据库检索数据(给出 503(服务不可用))

Heroku couldn't retrieve data from db (gives 503 (Service Unavailable)) after deployment MERN app

我的 MERN 堆栈应用程序在本地运行良好,但在 Heroku 上成功部署后,该应用程序可以运行但无法从 Mongodb 检索数据。项目未显示,用户无法登录,在控制台上出现此错误:

https://tranquil-ridge-25766.herokuapp.com/api/items 503 (Service Unavailable)

我尝试了很多东西但没有帮助。我怀疑我在

上做错了什么

if (process.env.NODE_ENV === "production")....

行。 (我还在 Heroku Settings 的 Config Vars 中添加 NODE.ENV = production)

这是我的 server.js :

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const config = require("config");
const cors = require("cors");
const path = require("path");

const app = express();
app.use(cors());
//Bodyparser Middleware
app.use(bodyParser.json());

// DB config

const db = config.get("mongoURI");

//connect to Mongo
mongoose
  .connect(db, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useUnifiedTopology: true
  })
  .then(() => console.log("MongoDB Connected..."))
  .catch(err => console.log(err));

//Use routes

app.use("/api/items", require("./routes/api/items"));
app.use("/api/users", require("./routes/api/users"));

//Serve static assets if in production
if (process.env.NODE_ENV === "production") {
  //set static folder
  app.use(express.static("client/build"));

  app.get("*", (req, res) => {
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  });
}

const port = process.env.PORT || 5000;

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

也许我们可以提取一些信息,准确地告诉我们得到的是什么数据库。

   const dbCheck = mongoose
      .connect(db, {
        useNewUrlParser: true,
        useCreateIndex: true,
        useUnifiedTopology: true
      })
      .then(() => console.log(dbCheck, '---db check----))
      .catch(err => console.log(err));

这可能会给我们一些关于您连接到哪个数据库的更多信息,也很难说,但是您如何检查您是否正在使用 prod 数据库?你在用这样的东西吗?

mongoose.connect(process.env.MONGODB_URI ||
    'mongodb://localhost:27017/kb')

如果您在 json 中输入 NODE_ENV,您确定它就是 "production" 吗?你可以 运行 一个

if (process.env.NODE_ENV == "production") {

这样您可能会发现您的 NODE_ENV 中有一个额外的 space 或类似的东西,仅用于故障排除。

好的,我终于找到了解决办法。对于遇到相同类型问题的任何人,您应该按照以下 4 个步骤在 Heroku 上部署 MERN 堆栈:

1- const port = process.env.PORT || 5000; 确保在 server.js

中为端口添加环境变量

2- 也将 process.env.MONGODB_URI 变量添加到您的 mongoose.connect

mongoose
  .connect(process.env.MONGODB_URI || db, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useUnifiedTopology: true
  })
  .then(() => console.log("MongoDB Connected..."))
  .catch(err => console.log(err));

3- 添加 if 语句以在生产中设置静态文件夹。它应该在你的应用路由之后

if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));

  app.get("*", (req, res) => {
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  });
}

4- 将这些行添加到主文件夹 package.json 文件中 scripts 对象

"heroku-postbuild": "cd client && npm install && npm run build"

在终端上通过 "heroku login" 和 "heroku create " 创建这些步骤后,最后一步是将 mongoLab 插件添加到 heroku:

heroku addons:create mongolab:sandbox

您需要向 Heroku 验证信用卡才能解决此问题,但请放心,"sandbox" 是一个免费选项,它从不收费。所以您的应用程序已准备就绪,详细说明,此外,感谢这个很棒的人,请在他的 youtube 频道上查看:Deploy a MERN Stack App to Heroku