Reputation: 7181
I have my first node.js app (runs fine locally) - but I am unable to deploy it via heroku (first time w/ heroku as well). The code is below. SO doesn't let me write so much code, so I would just say that the running the code locally as well within my network shows no issue.
var http = require('http');
var fs = require('fs');
var path = require('path');
http.createServer(function (request, response) {
console.log('request starting for ');
console.log(request);
var filePath = '.' + request.url;
if (filePath == './')
filePath = './index.html';
console.log(filePath);
var extname = path.extname(filePath);
var contentType = 'text/html';
switch (extname) {
case '.js':
contentType = 'text/javascript';
break;
case '.css':
contentType = 'text/css';
break;
}
path.exists(filePath, function(exists) {
if (exists) {
fs.readFile(filePath, function(error, content) {
if (error) {
response.writeHead(500);
response.end();
}
else {
response.writeHead(200, { 'Content-Type': contentType });
response.end(content, 'utf-8');
}
});
}
else {
response.writeHead(404);
response.end();
}
});
}).listen(5000);
console.log('Server running at http://127.0.0.1:5000/');
Any idea ?
Upvotes: 650
Views: 398413
Reputation: 31
I was working with a Vue app using vite when I ran into this issue. My npm run start
command was defined as:
"scripts": {
"start": "vite --port 8080",
}
The explanation has been overdue on this answer thread but I just thought to provide the syntax of the solution in case anybody else is looking for it:
"start": "vite --host '0.0.0.0' --port $PORT",
Upvotes: 2
Reputation: 27
I had a similar issue trying to solve it for hours (H10 GET=/). I tried changing PORT but with no results. Turns out the solution was simple. I changed one line in my package.json file. From nodemon to node and it worked:
"scripts": {
"start": "nodemon app.js"
To:
"scripts": {
"start": "node app.js"
Upvotes: 0
Reputation: 45
const PORT = process.env.PORT || 8080;
httpServer.listen(PORT, () => console.log(`--- Spinning on ${PORT} with ${process.env.NODE_ENV} environment 💖 ---`));
Upvotes: 0
Reputation: 27876
Heroku dynamically assigns your app a port, so you can't set the port to a fixed number. Heroku adds the port to the env, so you can pull it from there. Switch your listen to this:
.listen(process.env.PORT || 5000)
That way it'll still listen to port 5000 when you test locally, but it will also work on Heroku. Important note - PORT word must be capital.
You can check out the Heroku docs on Node.js here.
Upvotes: 1392
Reputation: 2370
In your package.json
file, in the scripts
, make sure your start
script contains -p $PORT
.
Example of package.json
(in this case, for NextJS app):
{
"private": true,
"scripts": {
"dev": "next dev -p 3001",
"build": "next build",
"start": "next start -p $PORT" // make sure to have -p $PORT in here
},
"dependencies": {
"typescript": "^4.3.2"
},
"devDependencies": {
"@next/eslint-plugin-next": "^11.1.2",
"@types/mongoose": "^5.11.97"
"typescript": "^4.3.2"
}
"license": "MIT"
}
Upvotes: 2
Reputation: 480
I wasted a full day thinking the backend had the problem. After going through all the solutions here for and a thorough log inspection, realized it was the frontend react App.js that had the problem.
I changed each
Axios.post(`${process.env.REACT_APP_BASE_URL}/createOrder`, {
})
to
Axios.post(`/createOrder`, {
})
and it worked!
Apparently react files had nothing to do with heroku deployment!
Upvotes: 0
Reputation: 4185
For me, the problem was capitalization. You know, after hours of coding, your eyes miss some little details.
In my code, I had process.env.port
instead of process.env.PORT
, so watch out, the PORT
environment variable must be uppercased.
See the example below:
const PORT = process.env.PORT || 3000;
const HOST = process.env.HOST || '0.0.0.0';
const express = require('express');
const app = express();
app.listen(PORT, HOST, () => {
console.log('Server started on ' + HOST + ':' + PORT);
})
Upvotes: 0
Reputation: 29
If you are getting this error and the above did not work, the error is not from the R10 itself.the error is caused by R14 (Memory quota exceeded) and this is because a part of your code uses multer (multer.diskStorage() method) or some other library for storing images or other files using some form of local storage. the delay caused by error R14 then leads to the R10 (Boot timeout) error.
solution:
in your package.json file, change your start to "start" : "node --max-old-space-size=4096 server/index.js". this increases storage size.
also
set this heroku variable heroku canfig:set NODE_ENV=dev
Upvotes: 0
Reputation: 431
this is also a good way.to solve the error
const PORT = process.env.PORT || 3000
app.listen(
PORT,
'0.0.0.0',
function () {
console.log("Server started.......");
}
);
Upvotes: 0
Reputation: 359
My case was that I was running Database scripts on start up and were taking long time. I solved this by manually running npm start
after deployment is complete.
Upvotes: 1
Reputation: 515
I will recommend you read the log very well in order to easily troubleshoot it.
if you are referencing a PORT as an environment variable (env) make sure it is PORT
not port
because heroku automatically assigns a PORT
number to your application when you deploy it. process.env.PORT
not process.env.port
Upvotes: 0
Reputation: 2197
Use process.env.PORT || 3000
for your port.
This will use Heroku's port when available or use port 3000 if it's not available (for example, local testing)
You can change 3000 to whatever you want, for example 8080
Upvotes: 2
Reputation: 21
To resolve this follow these Four simple steps: in the package.json file:
1- set the main field to the server file:
"main": "server.js" // <-- here set you server file
2- add the host parameter to the app.listen function
const port = process.env.PORT || 3000;
const host = '0.0.0.0'
app.listen(port, host, ()=> connsole.log(`server is running on port ${port}`)
3- add the postinstall script to package.json file
"scripts": {
"postinstall": "npm run build", // <-- add this line
"start": "node server.js" // <-- change server.js to you main file
}
4- add the engines field in package.json file
"engines": {
"node": ">=14.0.O", // <-- change it to your node version. you can "node -v" in you command line
"npm": ">=7.7.0" // <-- change this to your npm version. you can use "npm -v" in the command line to get your npm version
}
let me know if you have any succes with this!
Upvotes: 2
Reputation: 11
While developing the application we need to define the PORT in the following way:
const port = process.env.PORT || 4000; // PORT must be in caps
And while deploying the app to server add the following method:
app.listen(port, () => {
console.info("Server started listening.");
});
We can pass hostname as second parameter while running it in local. But while deploying it to server the hostname parameter should be removed.
app.listen(port, hostName, () => {
console.info(`Server listening at http://${hostName}:${port}`);
});
Upvotes: 1
Reputation: 1907
I've spent a lot of hours to find the root cause, and eventually I've found that this timeout (60s) can be adjustable. Here you may change 60 second to 120 or even more. It works for me, hope will help anybody else!
Upvotes: 2
Reputation: 5097
While most of the answers here are valid, for me the issue was that I was running long processes as part of npm run start
which caused the timeout.
I found the solution here and to summarize it, I just had to move npm run build
to a postinstall
task.
In other words, I changed this:
"start": "npm run build && node server.js"
to this:
"postinstall": "npm run build",
"start": "node server.js"
Come to think of this, it totally makes sense because this error (which used to appear occasionally) was becoming more and more common as my app kept growing.
Upvotes: 10
Reputation: 43
I have the same issue but my environment variables are set well and the version of npm and node is specified in package.json. I figured out it is because, in my case, Heroku needs "start" to be specified in package.json:
"scripts": {
"start": "node index.js"
}
After adding this to my package.json my node app is successfully deployed on Heroku.
Upvotes: 1
Reputation: 1140
I had the same issue because I didn't define Procfile
. Commit a text file to your app's root directory that is named Procfile
without a file extension. This file tells Heroku which command(s) to run to start your app.
web: node app.js
Upvotes: 3
Reputation: 199
change this line
app.listen(port);
to
app.listen(process.env.PORT, '0.0.0.0');
it will work
Upvotes: 12
Reputation: 31
I Use ReactJs, If you want upload to heroku add this in your webpack.config.js
Because if not add you will have error
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
//webpack.config.js add code like that
const HtmlWebPackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
var server_port = process.env.YOUR_PORT || process.env.PORT || 5000;
var server_host = process.env.YOUR_HOST || "0.0.0.0";
module.exports = {
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
}
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"]
}
]
},
devServer: {
disableHostCheck: true,
contentBase: "./ dist",
compress: true,
inline: true,
port: server_port,
host: server_host
},
plugins: [
new HtmlWebPackPlugin({
template: "./src/index.html",
filename: "index.html"
}),
new MiniCssExtractPlugin({
filename: "[name].css",
chunkFilename: "[id].css"
})
]
};
Upvotes: 3
Reputation: 4049
It's worth mentioning that if your code doesn't specify a port, then it shouldn't be a web
process and probably should be a worker
process instead.
So, change your Procfile
to read (with your specific command filled in):
worker: YOUR_COMMAND
and then also run on CLI:
heroku scale worker=1
Upvotes: 90
Reputation: 31
I realized that I don't need the port number in the request endpoint, so the endpoint was herokuapp.com
and not herokuapp.com:5000
.
The listen()
call can be without host and callback:
server.listen(5000);
Upvotes: 3
Reputation: 15
My problem was that when deploying to heroku I got an error:
Web process failed to bind to $PORT within 60 seconds of launch
when running heroku logs --tail
in the terminal. BUT the application would run as expected when I ran the server locally.
I had this in my index.js
file (server file)
const PORT = process.env.port || 4000
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`)
})
But should have had this
const PORT = process.env.PORT || 4000
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`)
})
Use process.env.PORT
, not process.env.port
, because port
is not the same as PORT
obviously.
Credit to gprasant.
Upvotes: 0
Reputation: 12065
In my case, neither the port nor the host was the problem. The index.js
was divided into 2 files. server.js
:
//server.js
const express = require('express')
const path = require('path')
const app = express()
app.use(express.static(path.resolve(__dirname, 'public')));
// and all the other stuff
module.exports = app
//app.js
const app = require('./server');
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0', () => {
console.log('Server is running s on port: ' + port)
});
from package.json
we ran node app.js
.
Apparently that was the problem. Once I combined the two into one file, the Heroku app deployed as expected.
Upvotes: 1
Reputation: 2819
Edit package.json
:
...
"engines": {
"node": "5.0.0",
"npm": "4.6.1"
},
...
and Server.js
:
...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
Upvotes: 2
Reputation: 567
Changing my listening port from 3000 to (process.env.PORT || 5000)
solved the problem.
Upvotes: 6
Reputation: 465
In my case I had two issues...
1) no listener at all because of running app from another entry file and this run script was deleted from package.json "scripts"
2) Case sensitive problem with 'Sequelize' instead of 'sequelize'
Upvotes: 0
Reputation: 43
I had same issue but with express and apollo-server. The solution from here:
The only special consideration that needs to be made is to allow heroku to choose the port that the server is deployed to. Otherwise, there may be errors, such as a request timeout.
To configure apollo-server to use a port defined by Heroku at runtime, the listen function in your setup file can be called with a port defined by the PORT environment variable:
> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => {
> console.log(`Server ready at ${url}`); });
Upvotes: 0
Reputation: 10368
If, like me, you're configuring Heroku to run a script from your package.json
file on deploy, make sure you haven't hard-coded the value of PORT
in that script! If you do, you'll end up like me and spend an hour trying to figure out why you're getting this error.
Upvotes: 0