Payne Tang
Payne Tang

Reputation: 151

Heroku 503 Service Unavailable

I am currently building a simple CRUD app using ExpressJS, and host it on Heroku using free account.

The problem I ran into is:

I do have other API end points that work on both local and Heroku server:

My guessing:

I tried to find some articles on the web but this seems hard to diagnose, anyone who has experience please let me know how I can solve this issue. Appreciate your comments.

My Mongoose Schema

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 end points that do not work

// 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 });
  }
});

The end point that works

// 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 });
  }
});

My package.json for this express app

{
  "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"
  }
}

EDIT: My 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 + "...");
});

Upvotes: 9

Views: 16821

Answers (5)

m'hd semps
m'hd semps

Reputation: 684

My issue was caused due to case sensitivity that is at times ignored by node, in my controllers I had a file named sessions.js yet when importing in my routes I had mistakenly put ... = require('../controllers/Sessions'), Nodemon was running without issues as I was developing but upon deploying on heroku it crashed so I changed to ... = require('../controllers/sessions') and now it runs ok

Upvotes: 0

Yasir Ahmed
Yasir Ahmed

Reputation: 21

I had the same problem and I was able to fix it by doing these two steps:

  1. Add node version to package.json file:
  "engines": {
    "node": "14.17.3"
  }
}
  1. I changed access settings in MongoDB, allowing access to the database from anywhere (basically, whitelisting 0.0.0.0/0 IP address)

Upvotes: 2

Rabia Baloch
Rabia Baloch

Reputation: 11

In my case, the issue was in package.json I installed two new packages yesterday and in my package.json:

"engines": {
    "node": "12.16.0"
  },

I changed the version to the my current system version:

"engines": {
    "node": "14.5.0"
  },

this is how my 503 service unavailable error gone.

Upvotes: 1

Mina
Mina

Reputation: 17224

This can be caused in several ways to the Node app.

1- Make sure that you specify the right port as what heroku does is it runs our app on a dynamic port.

const PORT = process.env.PORT || 3000;
app.listen(PORT, err => {
  if(err) throw err;
  console.log("%c Server running", "color: green");
});

as described in this comment https://stackoverflow.com/a/52992592/11887902

2- Make sure that you added the Procfile with

npm start

to start the application.

3- If you are using Nodemon and you install it globally, just make sure that you install it locally too.

Finally, just have a look at the logs of the project to figure what heppen to make your project not in the service.

enter image description here

These cases happened to me and caused this error.

Upvotes: 0

Payne Tang
Payne Tang

Reputation: 151

The root cause after checking is due to the access restriction from Heroku to Mongo atlas.

After adding 0.0.0.0/0 for IP whitelist, I am able to get data from MongoDB.

Reference: https://docs.atlas.mongodb.com/security-whitelist/#add-whitelist-entries

Upvotes: 6

Related Questions