[node.js] Heroku + node.js error (Web process failed to bind to $PORT within 60 seconds of launch)

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 ?

This question is related to node.js heroku

The answer is


A fixed number can't be set for port, heroku assigns it dynamically using process.env.PORT. But you can add them both, like this process.env.PORT || 5000. Heroku will use the first one, and your localhost will use the second one.

You can even add your call back function. Look at the code below

app.listen(process.env.PORT || 5000, function() {
    console.log("Server started.......");
});

Even if I'm too late but this might help someone who will get stuck too in the coming days. I faced the same issue but my problem was running many commands with npm start. I was running create tables and insert data before start the app and make 10 sec exceeds before running. So I removed those commands and problem solved.

Thanks


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"
    })
  ]
};

change this line

app.listen(port);

to

app.listen(process.env.PORT, '0.0.0.0');

it will work


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

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

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");
});
...

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.


In my case, I was using Babel with the babel-plugin-transform-inline-environment-variables plugin. Apparently, Heroku does not set the PORT env variable when doing a deployment, so process.env.PORT will be replaced by undefined, and your code will fallback to the development port which Heroku does not know anything about.


I had same issue I could resolved issue with replace 'localhost' with IP which is '0.0.0.0'


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"

enter image description here

2) Case sensitive problem with 'Sequelize' instead of 'sequelize'

enter image description here


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.


I had same issue while using yeoman's angular-fullstack generated project and removing the IP parameter worked for me.

I replaced this code

server.listen(config.port, config.ip, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

with

server.listen(config.port, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

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.


At of all the solution i have tried no one work as expected, i study heroku by default the .env File should maintain the convention PORT, the process.env.PORT, heroku by default will look for the Keyword PORT.

Cancel any renaming such as APP_PORT= instead use PORT= in your env file.


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.


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

For those that are passing both a port and a host, keep in mind that Heroku will not bind to localhost.

You must pass 0.0.0.0 for host.

Even if you're using the correct port. We had to make this adjustment:

# port (as described above) and host are both wrong
const host = 'localhost';
const port = 3000;

# use alternate localhost and the port Heroku assigns to $PORT
const host = '0.0.0.0';
const port = process.env.PORT || 3000;

Then you can start the server, as usual:

app.listen(port, host, function() {
  console.log("Server started.......");
});

You can see more details here: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error


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

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!


The error happens when Heroku failed to bind the port or hostname at server.listen(port, [host], [backlog], [callback]).

What Heroku requires is .listen(process.env.PORT) or .listen(process.env.PORT, '0.0.0.0')

So more generically, to support other environments, use this:

var server_port = process.env.YOUR_PORT || process.env.PORT || 80;
var server_host = process.env.YOUR_HOST || '0.0.0.0';
server.listen(server_port, server_host, function() {
    console.log('Listening on port %d', server_port);
});

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.


Changing my listening port from 3000 to (process.env.PORT || 5000) solved the problem.


From the heroku bash process, pass down the value of $PORT to your node app using an options parser like yargs.

Here is an example of how you might do that. On the scripts object, inside package.json, add a start method "node server --port $PORT".

In your server file, use yargs to get the value from the port option (--port $PORT) of the start method:

const argv = require('yargs').argv;
const app = require('express')();

const port = argv.port || 8081;

app.listen(argv.port, ()=>{
    console.log('Probably listening to heroku $PORT now ', argv.port); // unless $PORT is undefined, in which case you're listening to 8081.
});

Now when your app starts, it will bind to the dynamically set value of $PORT.


Restarting all dynos in heroku did the trick for me

enter image description here


In my case, I was using example from https://hapijs.com/

To fix the problem I replaced

server.connection({ 
    host: 'localhost', 
    port: 8000 
});

with

server.connection({
    port: process.env.PORT || 3000 
});

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

Examples related to node.js

Hide Signs that Meteor.js was Used Querying date field in MongoDB with Mongoose SyntaxError: Cannot use import statement outside a module Server Discovery And Monitoring engine is deprecated How to fix ReferenceError: primordials is not defined in node UnhandledPromiseRejectionWarning: This error originated either by throwing inside of an async function without a catch block dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib error running php after installing node with brew on Mac internal/modules/cjs/loader.js:582 throw err DeprecationWarning: Buffer() is deprecated due to security and usability issues when I move my script to another server Please run `npm cache clean`

Examples related to heroku

How to fix error "ERROR: Command errored out with exit status 1: python." when trying to install django-heroku using pip Can't push to the heroku ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings How to enable CORS in flask Error: Cannot pull with rebase: You have unstaged changes How to solve error "Missing `secret_key_base` for 'production' environment" (Rails 4.1) Failed to execute 'postMessage' on 'DOMWindow': The target origin provided does not match the recipient window's origin ('null') 'heroku' does not appear to be a git repository Heroku 'Permission denied (publickey) fatal: Could not read from remote repository' woes How do I set up DNS for an apex domain (no www) pointing to a Heroku app?