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(服务不可用)

解决入口服务不可用 503

AWS 503 服务暂时不可用

清漆 503 服务不可用

领事健康检查:503 服务不可用

如何解决错误 503 服务不可用