部署 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
我的 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