Heroku 503 服务不可用
Posted
技术标签:
【中文标题】Heroku 503 服务不可用【英文标题】:Heroku 503 Service Unavailable 【发布时间】:2020-05-26 08:29:24 【问题描述】:我目前正在使用 ExpressJS 构建一个简单的 CRUD 应用程序,并使用免费帐户将其托管在 Heroku 上。
我遇到的问题是:
获取所有项目的 GET API 在 localhost 上工作,但在 Heroku 上托管时显示状态 503; 用于更新一项的 POST API 可在 localhost 上运行,但与上述 GET API 的问题相同; 所有 503 错误都是在加载 30 秒后出现的,这应该是 Heroku 的设置。我确实有其他可以在本地和 Heroku 服务器上运行的 API 端点:
GET API 用于使用 ID 获取一项我的猜测:
问题不应该是代码问题 部署代码时出现问题,Heroku 无法处理此请求我试图在网上找到一些文章,但这似乎很难诊断,任何有经验的人请告诉我如何解决这个问题。感谢您的 cmets。
我的 Mongoose 架构
const mongoose = require("mongoose");
const ThoughtSchema = mongoose.Schema(
title:
type: String,
required: true
,
content:
type: String,
required: true
,
date:
type: Date,
default: Date.now
);
module.exports = mongoose.model("Thought", ThoughtSchema);
2 个无效的端点
// Returns all thoughts
router.get("/", async (req, res) =>
try
const thought = await Thought.find();
res.json(thought);
catch (err)
res.json( message: err );
);
// Submit a post
router.post("/", async (req, res) =>
const thought = new Thought(
title: req.body.title,
content: req.body.content
);
try
const savedThought = await thought.save();
res.json(savedThought);
catch (err)
res.json( message: err );
);
有效的终点
// Specific thought
router.get("/:thoughtId", async (req, res) =>
try
const thought = await Thought.findById(req.params.thoughtId);
res.json(thought);
catch (err)
res.json( message: err );
);
我的这个快递应用的 package.json
"name": "my-thoughts-app",
"version": "0.1.0",
"description": "An app to records user's thoughts",
"main": "index.js",
"scripts":
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
,
"repository":
"type": "git",
"url": "git+https://github.com/PayneTang/my-thoughts-app.git"
,
"author": "Payne Tang",
"license": "ISC",
"bugs":
"url": "https://github.com/PayneTang/my-thoughts-app/issues"
,
"homepage": "https://github.com/PayneTang/my-thoughts-app#readme",
"dependencies":
"dotenv": "^8.2.0",
"express": "^4.17.1",
"mongoose": "^5.8.11"
,
"devDependencies":
"typescript": "^3.7.5"
编辑: 我的 index.js
const express = require("express");
const path = require("path");
const app = express();
const mongoose = require("mongoose");
const thoughtRoute = require("./routes/thought");
require("dotenv").config();
console.log(process.env);
// Mongoose settings
mongoose.connect(
process.env.DB_CONNECTION,
useNewUrlParser: true, useUnifiedTopology: true ,
() =>
console.log("Connected to DB!");
);
app.use(express.json());
app.use((req, res, next) =>
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
);
app.use("/api/thought", thoughtRoute);
app.get("/api/test", (req, res) =>
res.send("hi");
);
// Serve client side
app.use(express.static(path.join(__dirname, "client/build")));
app.use(express.static(path.join(__dirname, "client/public")));
// app.get("*", (req, res) =>
// res.sendFile(path.join(__dirname, "client/build/index.html"));
// );
const PORT = process.env.PORT || 5000;
app.listen(PORT, () =>
console.log("Listening on port " + PORT + "...");
);
【问题讨论】:
我们能看到index.js
文件吗?
嗨@Zolbayar,我添加了index.js,谢谢。
部署后能否在 Heroku 日志中看到 Listening on port...
消息?
您是否已登录 heroku 并检查了您的应用程序的日志? (右上角,带有双箭头的“更多”->“查看日志”)
@zolbayar 我可以看到监听端口消息。事实上,只有两个 API 端点不起作用。其他人工作正常。
【参考方案1】:
查到根本原因是Heroku到Mongo atlas的访问限制。
为IP白名单添加0.0.0.0/0后,我就可以从MongoDB获取数据了。
参考:https://docs.atlas.mongodb.com/security-whitelist/#add-whitelist-entries
【讨论】:
IP白名单添加0.0.0.0/0后,可能需要重启heroku:heroku restart -a app_name
我遇到了同样的问题,从 heroku 日志中发现请求超时 - 我正在发送新请求,而旧请求尚未完成。所以我重构了我的代码,为每个请求发送更小的数据块,并设置了一个超时函数。以上是关于Heroku 503 服务不可用的主要内容,如果未能解决你的问题,请参考以下文章
React-Heroku Postgress-Addon:GET http://app-name.herokuapp.com/any 503(服务不可用)