Heroku + node.js-fout (webproces kon binnen 60 seconden na lancering niet binden aan $PORT)

Ik heb mijn eerste node.js-app (werkt lokaal prima) – maar ik kan hem niet via heroku implementeren (ook de eerste keer met heroku). De code staat hieronder. SO laat me niet zoveel code schrijven, dus ik zou gewoon zeggen dat het geen probleem is om de code zowel lokaal als binnen mijn netwerk uit te voeren.

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

Enig idee?


Antwoord 1, autoriteit 100%

Heroku wijst dynamisch een poort toe aan je app, dus je kunt de poort niet op een vast nummer instellen. Heroku voegt de poort toe aan de env, zodat je hem daar vandaan kunt halen. Schakel je luister hiernaar om:

.listen(process.env.PORT || 5000)

Op die manier luistert het nog steeds naar poort 5000 wanneer je lokaal test, maar het werkt ook op Heroku.

Je kunt hierde Heroku-documenten op Node.js bekijken.


Antwoord 2, autoriteit 5%

Het is vermeldenswaard dat als uw code geen poort specificeert, het geen web-proceszou moeten zijn en waarschijnlijk een workerproces in plaats daarvan.

Dus, verander je Procfileom te lezen (met je specifieke commando ingevuld):

worker: YOUR_COMMAND

en dan ook draaien op CLI:

heroku scale worker=1

Antwoord 3, autoriteit 4%

De fout treedt op wanneer Heroku de poort of hostnaam niet kon bindenop server.listen(port, [host], [backlog], [callback]).

Wat Heroku nodig heeft is .listen(process.env.PORT)of .listen(process.env.PORT, '0.0.0.0')

Dus meer algemeen, om andere omgevingen te ondersteunen, gebruik dit:

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

Antwoord 4, autoriteit 3%

Voor degenen die zowel een poort als een host passeren, houd er rekening mee dat Heroku niet bindt aanlocalhost.

U moet doorgeven0.0.0.0voor host.

Zelfs als je de juiste poort gebruikt. We moesten deze aanpassing maken:

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

Vervolgens kunt u de server zoals gewoonlijk starten:

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

Je kunt hier meer details zien: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error


Antwoord 5, autoriteit 2%

Ik had hetzelfde probleem tijdens het gebruik van yeoman’s angular-fullstack gegenereerde project en het verwijderen van de IP-parameter werkte voor mij.

Ik heb deze code vervangen

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

met

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

Antwoord 6

In mijn geval gebruikte ik een voorbeeld van https://hapijs.com/

Om het probleem op te lossen dat ik heb vervangen

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

met

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

Antwoord 7

verander deze regel

app.listen(port);

naar

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

het zal werken


Antwoord 8

Mijn luisterpoort wijzigen van 3000 in (process.env.PORT || 5000)loste het probleem op.


Antwoord 9

Hoewel de meeste antwoorden hier geldig zijn, was het probleem voor mij dat ik lange processen uitvoerde als onderdeel van npm run startwat de time-out veroorzaakte.

Ik heb de oplossing gevonden hieren om het samen te vatten, ik moest gewoon npm run buildverplaatsen naar een postinstall-taak.

Met andere woorden, ik heb dit gewijzigd:

"start": "npm run build && node server.js"

naar dit:

"postinstall": "npm run build",
"start": "node server.js"

Nu ik hierover nadenk, is het volkomen logisch omdat deze fout (die af en toe voorkwam) steeds vaker voorkwam naarmate mijn app bleef groeien.


Antwoord 10

Het herstarten van alle dyno’s in Heroku deed de truc voor mij


Antwoord 11

In mijn geval gebruikte ik Babel met de plug-in babel-plugin-transform-inline-environment-variables. Blijkbaar stelt Heroku de PORT env-variabele niet in bij het uitvoeren van een implementatie, dus process.env.portzal worden vervangen door undefined, en je code zal terugvallen naar de ontwikkelpoort waar Heroku niets van weet.


Antwoord 12

Ik realiseerde me dat ik het poortnummer in het verzoek-eindpunt niet nodig heb, dus het eindpunt was herokuapp.comen niet herokuapp.com:5000.

p>

De listen()-aanroep kan zijn zonder host en terugbellen:

server.listen(5000);

Antwoord 13

Bewerk package.json:

...
"engines": {
"node": "5.0.0",
"npm": "4.6.1"
},
...

en Server.js:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...

Antwoord 14

Ik gebruik ReactJ’s,
Als je wilt uploaden naar heroku, voeg dit dan toe aan je webpack.config.js

Want als u niet toevoegt, krijgt u een fout

Fout R10 (opstarttime-out) -> Webproces kon niet binden aan $PORT binnen
60 seconden opstarten

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

Antwoord 15

Ik had hetzelfde probleem omdat ik Procfileniet had gedefinieerd. Leg een tekstbestand vast in de hoofdmap van uw app met de naam Procfilezonder bestandsextensie. Dit bestand vertelt Heroku welke opdracht(en) hij moet uitvoeren om je app te starten.

web: node app.js

Antwoord 16

Ik had hetzelfde probleem. Ik kon het probleem oplossen door ‘localhost’ te vervangen door IP, namelijk ‘0.0.0.0’


Antwoord 17

Ik heb veel uren besteed aan het vinden van de oorzaak en uiteindelijk heb ik ontdekt dat deze time-out (60s) kan worden aangepast. Hierkun je 60 seconden wijzigen in 120 of zelfs meer. Het werkt voor mij, ik hoop dat iemand anders kan helpen!


Antwoord 18

Tijdens het ontwikkelen van de applicatie moeten we de PORT op de volgende manier definiëren:

const port = process.env.PORT || 4000; // PORT must be in caps

En terwijl u de app op de server implementeert, voegt u de volgende methode toe:

app.listen(port, () => {
 console.info("Server started listening.");
});

We kunnen hostnaam doorgeven als tweede parameter terwijl het lokaal wordt uitgevoerd. Maar terwijl het op de server wordt geïmplementeerd, moet de parameter hostnaam worden verwijderd.

app.listen(port, hostName, () => {
  console.info(`Server listening at http://${hostName}:${port}`);
});

Antwoord 19

Gebruik process.env.PORT || 3000voor uw poort.

Dit gebruikt de poort van Heroku indien beschikbaar of gebruikt poort 3000 als deze niet beschikbaar is (bijvoorbeeld lokale tests)

U kunt 3000 wijzigen in wat u maar wilt, bijvoorbeeld 8080


Antwoord 20

Er kan geen vast nummer worden ingesteld voor poort, heroku wijst het dynamisch toe met behulp van process.env.port. Maar je kunt ze allebei toevoegen, zoals deze process.env.PORT || 5000. Heroku zal de eerste gebruiken, en uw localhost zal de tweede gebruiken.

Je kunt zelfs je terugbelfunctie toevoegen. Kijk naar de onderstaande code

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

Antwoord 21

Alle oplossingen die ik heb geprobeerd, werkt niet zoals verwacht, ik bestudeer heroku standaard, het .env-bestand moet de conventie PORT behouden, de process.env.PORT, heroku zoekt standaard naar het trefwoord PORT.

Annuleer het hernoemen, zoals APP_PORT=, gebruik in plaats daarvan PORT= in uw env-bestand.


Antwoord 22

Van het heroku bash-proces geeft u de waarde van $PORT door aan uw node-app met behulp van een optiesparser zoals yargs.

Hier is een voorbeeld van hoe u dat zou kunnen doen. Voeg aan het scriptobject, in package.json, een startmethode “node server –port $PORT” toe.

Gebruik in uw serverbestand yargs om de waarde uit de poortoptie (–port $PORT) van de startmethode te halen:

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

Als uw app nu start, wordt deze gekoppeld aan de dynamisch ingestelde waarde van $PORT.


Antwoord 23

Als je, zoals ik, Heroku configureert om een script uit je package.json-bestand uit te voeren bij de implementatie, zorg er dan voor dat je de waarde van PORTin dat script! Als je dat doet, eindig je net als ik en ben je een uur bezig om erachter te komen waarom je deze foutmelding krijgt.


Antwoord 24

Ik had hetzelfde probleem, maar met express en apollo-server. De oplossing van hier:

De enige speciale overweging die gemaakt moet worden, is toestaan
heroku om de poort te kiezen waarop de server wordt geïmplementeerd. Anders,
er kunnen fouten zijn, zoals een time-out voor een verzoek.

Om apollo-server te configureren om een poort te gebruiken die tijdens runtime door Heroku is gedefinieerd,
de luisterfunctie in je setup-bestand kan worden aangeroepen met een poort
gedefinieerd door de omgevingsvariabele PORT:

> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });

Antwoord 25

In mijn geval had ik twee problemen …

1) Geen luisteraar vanwege het uitvoeren van app vanuit een ander invoerbestand en dit uitvoerende script is verwijderd van Package.json “Scripts”

2) Case gevoelig probleem met ‘Sequelize’ in plaats van ‘Sequelize’


Antwoord 26

In mijn geval was noch de poort noch de gastheer het probleem. De index.jswas verdeeld in 2 bestanden. 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)
});

Vanaf package.jsonWe hebben node app.js.

Blijkbaar was dat het probleem. Zodra ik de twee in één bestand combineerde, heeft de Heroku-app geïmplementeerd zoals verwacht.


Antwoord 27

Mijn probleem was dat ik bij het implementeren van Heroku een foutmelding kreeg:

Webproces kan niet binnen 60 seconden na de lancering aan $ Poort binden

bij het uitvoeren van heroku logs --tailin de terminal. MAAR de applicatie zou werken zoals verwacht toen ik de server lokaal draaide.

Ik had dit in mijn index.js-bestand (serverbestand)

const PORT = process.env.port || 4000
app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Maar had dit moeten hebben

const PORT = process.env.PORT || 4000
app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Gebruik process.env.port, niet process.env.port, omdat PORTniet hetzelfde is als PORTduidelijk.

Met dank aan gprasant.


Antwoord 28

Ik heb hetzelfde probleem, maar mijn omgevingsvariabelen zijn goed ingesteld en de versie van npm en node is gespecificeerd in package.json. Ik kwam erachter dat Heroku in mijn geval “start”moet specificeren in package.json:

 "scripts": {
    "start": "node index.js"
  }

Nadat ik dit aan mijn package.json heb toegevoegd, is mijn node-app succesvol geïmplementeerd op Heroku.


Antwoord 29

Volg deze vier eenvoudige stappen om dit op te lossen:
in het bestand package.json:

1- stel het hoofdveld in op het serverbestand:

"main": "server.js" // <-- here set you server file

2- voeg de hostparameter toe aan de app.listen-functie

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- voeg het postinstall-script toe aan het bestand package.json

"scripts": {
     "postinstall": "npm run build", // <-- add this line
     "start": "node server.js" // <-- change server.js to you main file
}

4- voeg het engine-veld toe aan het bestand package.json

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

Laat het me weten als je hier enig succes mee hebt!


Antwoord 30

Ik raad je aan het logboek goed te lezen om het probleem gemakkelijk op te lossen.
als u naar een PORT verwijst als een omgevingsvariabele (env), zorg er dan voor dat het PORTis en niet PORTomdat heroku automatisch een PORT-nummer toewijst aan uw toepassing wanneer u deze implementeert. process.env.portniet process.env.port

Other episodes