Errore Heroku + node.js (il processo Web non è riuscito a collegarsi a $ PORT entro 60 secondi dal lancio)


447

Ho la mia prima app node.js (funziona bene localmente) - ma non riesco a distribuirla tramite heroku (anche la prima volta con heroku). Il codice è sotto. SO non mi permette di scrivere così tanto codice, quindi direi solo che l'esecuzione del codice localmente e all'interno della mia rete non mostra alcun problema.

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

Qualche idea ?


Puoi pubblicare il tuo codice qui? Preferibilmente la parte .listen () se si avvia un server http
Benjamin Gruenbaum,

Risposte:


991

Heroku assegna dinamicamente alla tua app una porta, quindi non puoi impostare la porta su un numero fisso. Heroku aggiunge la porta all'ENV, quindi puoi estrarla da lì. Passa il tuo ascolto a questo:

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

In questo modo ascolterà ancora la porta 5000 quando esegui i test in locale, ma funzionerà anche su Heroku.

Puoi consultare i documenti Heroku su Node.js qui .


97
importante usare process.env.PORT e non process.env.port.
gprasant,

bellissimo! ha funzionato per me con il modulo "websocket".
philx_x,


2
Grazie, ha lavorato anche per me. Sono sorpreso che ciò non sia stato
chiarito nei

@redhotvengeance grazie .. menziona la distinzione tra maiuscole e minuscole e salva il giorno :)
Mahendran

34

L'errore si verifica quando Heroku non riesce a associare la porta o il nome host a server.listen(port, [host], [backlog], [callback]).

Ciò che Heroku richiede è .listen(process.env.PORT)o.listen(process.env.PORT, '0.0.0.0')

Quindi, più genericamente, per supportare altri ambienti, usa questo:

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

6
Con la seguente chiamata: app.listen (serverPort, "localhost", funzione (err) {Heroku non è riuscito. Il passaggio da "localhost" a "0.0.0.0" ha aiutato. Grazie!
pubsy,

31

Vale la pena ricordare che se il codice non specifica una porta, non dovrebbe essere un webprocesso e probabilmente dovrebbe essere un workerprocesso.

Quindi, modifica il tuo Procfileda leggere (con il tuo comando specifico inserito):

worker: YOUR_COMMAND

e quindi eseguire anche sulla CLI:

heroku scale worker=1

1
Ho avuto lo stesso problema Ho risolto il problema con sostituire "localhost" con IP che è "0.0.0.0"
Damith Asanka

2
Sto eseguendo un bot Discord su Heroku, e questo mi ha gettato per un ciclo. I robot allentati, Hipchat, ecc. Potrebbero avere problemi simili.
Skylar,

1
Se segui questa strada, assicurati di accedere alla scheda Risorse, disattivare il processo Web e attivare il processo di lavoro. In questo modo Heroku non si aspetterà un bind di porta.
Isaac Lyman,

1
Oh, grazie mille. Sono impazzito cercando di cercare questo. Non avevo idea che le applicazioni web e di lavoro differissero in Heroku in termini di Procfile. Vale la pena ricordare che avevano bisogno di me per aggiungere una startsceneggiatura nel miopackage.json
Rishav

1
Nel mio caso ho cambiato il procfile da web a worker. Ha funzionato!! Thkns
rodrigorf,

27

Ho avuto lo stesso problema durante l'utilizzo del progetto yeoman generato dallo stack completo angolare e la rimozione del parametro IP ha funzionato per me.

Ho sostituito questo codice

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

con

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

25

Per coloro che stanno passando sia una porta che un host, tieni presente che Heroku non si legherà localhost .

Devi passare 0.0.0.0 per l'host.

Anche se stai usando la porta corretta. Abbiamo dovuto apportare questa modifica:

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

Quindi puoi avviare il server, come al solito:

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

Puoi vedere maggiori dettagli qui: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error


3
Questa risposta non è solo più completa, ma l'unica che ha preso di mira i due possibili problemi. Nel mio caso la configurazione della porta era corretta, ma non l'indirizzo di ascolto. Questa dovrebbe essere la risposta accettata.
Danielo515,

Nel mio caso funziona come cambia come di seguito const port = 3000;a const port = process.env.PORT || 3000; funziona su Heroku
vpgodara

l'unica cosa che effettivamente ha funzionato per me, grazie
Ibrahim Mohammed,

10

Nel mio caso, stavo usando un esempio da https://hapijs.com/

Per risolvere il problema ho sostituito

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

con

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

e per quelli che servono specificando process.env.PORTcorrettamente, ma lasciando nel hostparametro: non puoi :) vedi qui: stackoverflow.com/a/34956330/626369
Dominick,

3

Cambiare la mia porta di ascolto da 3000 per (process.env.PORT || 5000)risolvere il problema.


2

Nel mio caso, stavo usando Babel con il plug-in babel-plugin-transform-inline-environment-variabili . Apparentemente, Heroku non imposta la variabile env PORT durante l'esecuzione di una distribuzione, quindi process.env.PORTverrà sostituito da undefined, e il tuo codice tornerà alla porta di sviluppo di cui Heroku non sa nulla.


1

Modifica package.json:

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

e Server.js:

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

Nel mio caso ho eliminato quella parte del package.json. Credo che aggiornarlo dovrebbe risolvere anche questo problema.
Mark

1

Ho avuto lo stesso problema perché non ho definito Procfile. Esegui il commit di un file di testo nella directory principale della tua app che si chiama Procfile senza estensione. Questo file dice a Heroku quali comandi eseguire per avviare la tua app.

web: node app.js

Grazie, ho dimenticato di farlo. Senza questo file, l'heroku ignora completamente i file.
Vladimir Despotovic,

0

Ho avuto lo stesso problema Ho risolto il problema con sostituire "localhost" con IP che è "0.0.0.0"


0

Non è possibile impostare un numero fisso per la porta, heroku lo assegna in modo dinamico utilizzando process.env.PORT. Ma puoi aggiungerli entrambi, in questo modo process.env.PORT || 5000. Heroku utilizzerà il primo e il tuo host locale utilizzerà il secondo.

È anche possibile aggiungere la funzione di richiamata. Guarda il codice qui sotto

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

0

Per quanto riguarda la soluzione, non ho provato nessuno a funzionare come previsto, studio di default heroku il file .env dovrebbe mantenere la convenzione PORT, process.env.PORT, heroku per impostazione predefinita cercherà la parola chiave PORT.

Annulla qualsiasi ridenominazione come APP_PORT = invece usa PORT = nel tuo file env.


0

Dal processo heroku bash, passa il valore di $ PORT all'app del tuo nodo usando un parser di opzioni come yargs.

Ecco un esempio di come potresti farlo. Sull'oggetto script, all'interno di package.json, aggiungi un metodo di avvio "node server --port $ PORT".

Nel tuo file server, usa yargs per ottenere il valore dall'opzione port (--port $ PORT) del metodo start:

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

Ora quando la tua app viene avviata, si legherà al valore impostato dinamicamente di $ PORT.


0

Se, come me, stai configurando Heroku per eseguire uno script dal tuo package.jsonfile al momento della distribuzione, assicurati di non aver codificato il valore PORTin quello script! Se lo fai, finirai come me e passerai un'ora a cercare di capire perché stai ricevendo questo errore.


0

Ho avuto lo stesso problema ma con express e apollo-server. La soluzione da qui :

L'unica considerazione speciale che deve essere fatta è consentire a heroku di scegliere la porta su cui è distribuito il server. Altrimenti, potrebbero esserci errori, come un timeout della richiesta.

Per configurare apollo-server per usare una porta definita da Heroku in fase di runtime, la funzione di ascolto nel tuo file di installazione può essere chiamata con una porta definita dalla variabile d'ambiente PORT:

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

0

Nel mio caso ho avuto due problemi ...

1) nessun ascoltatore a causa dell'esecuzione di app da un altro file di voce e questo script di esecuzione è stato eliminato dagli "script" package.json

inserisci qui la descrizione dell'immagine

2) Problema sensibile al maiuscolo / minuscolo con "Sequelize" anziché "sequelize"

inserisci qui la descrizione dell'immagine


0

Uso ReactJs, se vuoi caricare su heroku aggiungilo nel tuo webpack.config.js

Perché se non aggiungi avrai errore

Errore R10 (timeout di avvio) -> Il processo Web non è riuscito a collegarsi a $ PORT entro 60 secondi dall'avvio

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

0

Nel mio caso, il problema non era né la porta né l'host. Il è index.jsstato diviso in 2 file. 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)
});

da cui package.jsonsiamo corsi node app.js.

Apparentemente quello era il problema. Una volta che ho combinato i due in un unico file, l'app Heroku è stata distribuita come previsto.


0

Il mio problema era che durante la distribuzione su heroku ho ricevuto un errore:

Il processo Web non è riuscito a collegarsi a $ PORT entro 60 secondi dal lancio

quando si esegue heroku logs --tailnel terminale. MA l'applicazione funzionerà come previsto quando ho eseguito il server localmente.

Ho avuto questo nel mio index.jsfile (file server)

const PORT = process.env.port || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Ma avrebbe dovuto avere questo

const PORT = process.env.PORT || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Usa process.env.PORT, no process.env.port, perché portnon è lo stesso di PORTovviamente.

Ringraziamo gprasant .


0

Mi sono reso conto che non avevo bisogno del numero di porta nell'endpoint della richiesta, quindi l'endpoint era herokuapp.come non herokuapp.com:5000.

La listen()chiamata può essere senza host e callback:

server.listen(5000);

Non è necessario il numero di porta nell'URL se si utilizza la porta predefinita. Quindi come risolve il problema?
RalfFriedl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.