8

I deployed my Node.js WebApp to heroku but I'm getting this error

2021-06-01T09:19:42.615419+00:00 heroku[web.1]: State changed from crashed to starting
2021-06-01T09:19:47.259832+00:00 heroku[web.1]: Starting process with command `node app.js`
2021-06-01T09:19:51.146182+00:00 app[web.1]: Server is running on port 3001.
2021-06-01T09:20:47.916699+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to 
bind to $PORT within 60 seconds of launch
2021-06-01T09:20:47.989032+00:00 heroku[web.1]: Stopping process with SIGKILL
2021-06-01T09:20:48.124402+00:00 heroku[web.1]: Process exited with status 137
2021-06-01T09:20:48.196055+00:00 heroku[web.1]: State changed from starting to crashed
2021-06-01T09:24:45.072782+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET 
path="/" host=positate.herokuapp.com request_id=7e9ec2b1-5685-4c3f-9c29-6c03268b7c82 
fwd="157.51.56.186" dyno= connect= service= status=503 bytes= protocol=https
2021-06-01T09:24:46.540443+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET 
path="/favicon.ico" host=positate.herokuapp.com request_id=4ab44a6a-4795-4a4d-b32d-28d796845774 
fwd="157.51.56.186" dyno= connect= service= status=503 bytes= protocol=https

I'm attaching my app.js here

require("dotenv").config();
const express = require("express");
const app = express();
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const GoogleStrategy = require("passport-google-oauth20").Strategy;
const findOrCreate = require("mongoose-findorcreate");
const timestamp = require("mongoose-timestamp");
const MongoStore = require('connect-mongo');

const auth = require("./routes/auth");
const User = require("./database/models/user_model");

const blogRoute = require("./routes/blogRoute");


mongoose.connect(process.env.DB_URI, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});
mongoose.set("useCreateIndex", true);
mongoose.set("useFindAndModify", false);

app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(express.urlencoded({ extended: true }));
app.use(express.json());



app.use(session({
  secret: "foo",
  saveUninitialized: false,
  resave: false,
  store: MongoStore.create({
    mongoUrl: process.env.DB_URI,
    mongoOptions: { useUnifiedTopology: true },
    collectionName: 'sessions',
    autoRemove: 'native',
  })
}));

app.use(passport.initialize());
app.use(passport.session());

passport.use(User.createStrategy());

passport.serializeUser(function (user, done) {
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  User.findById(id, function (err, user) {
    done(err, user);
  });
});

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
      callbackURL: "http://localhost:3001/auth/google/positate" || "https://positate.herokuapp.com/auth/google/positate",
    },
    function (accessToken, refreshToken, profile, cb) {
      User.findOrCreate(
        {
          googleId: profile.id,
          name: profile.displayName,
          username: profile.emails[0].value,
          image: profile.photos[0].value,
        },
        function (err, user) {
          return cb(err, user);
        }
      );
    }
  )
);

app.get("/", (req, res) => {
  res.render("Landing");
});

app.use("/", auth);
app.use("/blog", blogRoute);
app.use("/", blogRoute);
app.use("/category", blogRoute);


app.listen(3001 || process.env.PORT, '0.0.0.0', () => {
  console.log("Server is running.");
});
This is my Procfile
web: node app.js

This is my package.json

{
  "name": "positate",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "engines": {
    "node": "14.15.4",
    "npm": "6.14.10"
  },
  "scripts": {
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "connect-mongo": "^4.4.1",
    "dotenv": "^10.0.0",
    "ejs": "^3.1.6",
    "express": "^4.17.1",
    "express-session": "^1.17.2",
    "mongoose": "^5.12.11",
    "mongoose-findorcreate": "^3.0.0",
    "mongoose-timestamp": "^0.6.0",
    "passport": "^0.4.1",
    "passport-google-oauth20": "^2.0.0",
    "passport-local": "^1.0.0",
    "passport-local-mongoose": "^6.1.0"
  }
}

I tried various solutions for this error but was not able to solve it. I've been trying to solve this for the past three days. Kindly help me solve this error Thank you so much in Advance.

TechySharnav
  • 4,869
  • 2
  • 11
  • 29
Srihari S
  • 83
  • 1
  • 3

3 Answers3

10

The issue is the way you define the port, it always runs on 3001 which is not possible on Heroku, you need to bind the $PORT env variable.
Change your code to check first fi the process.env.PORT is defined (it will be on Heroku but on your local dev environment it will default to 3001)

app.listen(process.env.PORT || 3001, '0.0.0.0', () => {
  console.log("Server is running.");
});

See NodeJS on Heroku

Beppe C
  • 11,256
  • 2
  • 19
  • 41
  • I'm still getting this error, deploying a fastify app. This is my start script: "start": "fastify start -p process.env.PORT -l info app.js", What am I doing wrong? – Daniel Tkach Mar 15 '22 at 21:28
  • You should use `process.env.PORT` in the Node code (not in the start script) – Beppe C Mar 16 '22 at 08:07
2

I had the same issue and it drove me mad for plenty of time.

The fix was to configure my webserver to do BOTH of the following:

  1. automatically pick up port from process.env.PORT (also known as the $PORT environment variable. Heroku sets this automatically at deployment time.)
  2. listen explicitly at the address 0.0.0.0 (locahost didn't work!)

Turns out Heroku is explaining this in their help guide already:

In rarer cases, your app may be using process.env.PORT, but may still be failing to bind. This can be caused by the app attempting to bind on localhost. Instead, you may need to change this to 0.0.0.0.

maninak
  • 2,633
  • 2
  • 18
  • 33
1

Remove the engines from your package.json and try running it again. It looks like there was an issue related to this

Source

Adithya Kamath
  • 363
  • 2
  • 9