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 mand `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 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 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" || "",
},
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.");
});
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 mand `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. 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. 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./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.
Share Improve this question edited Jun 2, 2021 at 2:11 TechySharnav 5,0842 gold badges13 silver badges29 bronze badges asked Jun 1, 2021 at 9:32 Srihari SSrihari S 831 silver badge3 bronze badges 3- Do you have a dotenv file with the port inside the project? – Manuel Spigolon Commented Jun 1, 2021 at 9:35
- I have it on my local directory and I added the config vars in heroku – Srihari S Commented Jun 1, 2021 at 10:37
- The webapp is running perfectly on my local server – Srihari S Commented Jun 1, 2021 at 10:40
3 Answers
Reset to default 10The 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
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:
- automatically pick up port from
process.env.PORT
(also known as the$PORT
environment variable. Heroku sets this automatically at deployment time.) - 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 onlocalhost
. Instead, you may need to change this to0.0.0.0
.
Remove the engines from your package.json and try running it again. It looks like there was an issue related to this
Source