Błąd Heroku + node.js (proces sieciowy nie powiązał się z $ PORT w ciągu 60 sekund od uruchomienia)

447

Mam swoją pierwszą aplikację node.js (działa dobrze lokalnie) - ale nie jestem w stanie wdrożyć jej przez heroku (również za pierwszym razem w / heroku). Kod znajduje się poniżej. SO nie pozwala mi pisać tak dużo kodu, więc powiem tylko, że uruchomienie kodu również lokalnie w mojej sieci nie powoduje żadnego problemu.

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

Dowolny pomysł ?

użytkownik428900
źródło
Czy możesz tutaj opublikować swój kod? Najlepiej część .listen (), jeśli uruchamiasz serwer http
Benjamin Gruenbaum

Odpowiedzi:

989

Heroku dynamicznie przypisuje twojej aplikacji port, więc nie możesz ustawić portu na stały numer. Heroku dodaje port do env, więc możesz go pobrać z tego miejsca. Przełącz słuchanie na to:

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

W ten sposób nadal będzie nasłuchiwał portu 5000 podczas testowania lokalnego, ale będzie również działał na Heroku.

Możesz sprawdzić dokumentację Heroku na Node.js tutaj .

redhotvengeance
źródło
97
ważne, abyś korzystał z pliku process.env.PORT, a nie z portport.env.port.
gprasant
piękny! pracował dla mnie z modułem „websocket”.
philx_x
2
Dzięki, pracowałem też dla mnie. Dziwi mnie, że nie zostało to wyjaśnione w dokumentach
Heroku
@ redhotvengeance dziękuję .. wspomnij, że wielkość liter ma znaczenie i oszczędzaj dzień :)
Mahendran
34

Błąd występuje, gdy Heroku nie może powiązać portu lub nazwy hosta w server.listen(port, [host], [backlog], [callback]).

To, czego wymaga Heroku, to .listen(process.env.PORT)lub.listen(process.env.PORT, '0.0.0.0')

Mówiąc bardziej ogólnie, aby obsługiwać inne środowiska, użyj tego:

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);
});
Royce Lee
źródło
6
Z następującym wywołaniem: app.listen (serverPort, „localhost”, funkcja (err) {Heroku nie powiodło się. Pomogło przełączenie „localhost” na „0.0.0.0”. Dzięki!
pubsy
31

Warto wspomnieć, że jeśli twój kod nie określa portu, to nie powinien to być webproces i prawdopodobnie powinien to być workerproces.

Więc zmień swój Procfilena czytający (z wypełnionym konkretnym poleceniem):

worker: YOUR_COMMAND

a następnie uruchom także na CLI:

heroku scale worker=1
zthomas.nc
źródło
1
Miałem ten sam problem, który mogłem rozwiązać, zastępując „localhost”
Damith Asanka
2
Korzystam z bota Discord na Heroku, co rzuciło mnie na pętlę. Slack, Hipchat itp. Boty mogą prawdopodobnie mieć podobne problemy.
Skylar
1
Jeśli wybierzesz tę trasę, koniecznie przejdź do karty Zasoby, wyłącz proces sieciowy i włącz proces roboczy. W ten sposób Heroku nie spodziewa się wiązania portu.
Isaac Lyman
1
Och, dziękuję bardzo. Oszalałem próbując to sprawdzić. Nie miałem pojęcia, że ​​aplikacje sieciowe i robocze różniły się w Heroku pod względem pliku Procfile. Warto wspomnieć, że potrzebowali mnie do dodania startskryptu w moimpackage.json
Rishav
1
W moim przypadku zmieniłem plik proc z web na robot. Zadziałało!! Thkns
rodrigorf
27

Miałem ten sam problem, gdy korzystałem z projektu generowanego przez Angulara fullstack i usunięcie parametru IP działało dla mnie.

Zamieniłem ten kod

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

z

server.listen(config.port, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
vinesh
źródło
25

Dla tych, którzy przechodzą zarówno przez port, jak i przez hosta, należy pamiętać, że Heroku nie będzie się wiązać localhost .

Musisz podać 0.0.0.0 hosta.

Nawet jeśli używasz właściwego portu. Musieliśmy dokonać tej korekty:

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

Następnie możesz uruchomić serwer, jak zwykle:

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

Możesz zobaczyć więcej szczegółów tutaj: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

gregb
źródło
3
Ta odpowiedź jest nie tylko bardziej kompletna, ale jedyna, która dotyczyła dwóch możliwych problemów. W moim przypadku konfiguracja portu była prawidłowa, ale nie adres odbiorczy. To powinna być zaakceptowana odpowiedź.
Danielo515
W moim przypadku działa tak, jak zmieniam, jak poniżej, const port = 3000;aby const port = process.env.PORT || 3000;działało na heroku
vpgodara
jedyna rzecz, która naprawdę dla mnie zadziałała, dzięki
Ibrahim Mohammed
10

W moim przypadku korzystałem z przykładu z https://hapijs.com/

Aby naprawić problem, wymieniłem

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

z

server.connection({
    port: process.env.PORT || 3000 
});
nexuzzz
źródło
a dla tych użytkowników, którzy określają process.env.PORTpoprawnie, ale pozostawiając w hostparametrze: nie możesz :) zobacz tutaj: stackoverflow.com/a/34956330/626369
Dominick
3

Zmiana portu nasłuchiwania z 3000, aby (process.env.PORT || 5000)rozwiązać problem.

Akshata Dabade
źródło
2

W moim przypadku korzystałem z Babel z wtyczką babel-plugin-transform-inline-zmienne środowiskowe . Najwyraźniej Heroku nie ustawia zmiennej env PORT podczas wdrażania, więc process.env.PORTzostanie zastąpiona przez undefined, a twój kod wróci do portu programistycznego, o którym Heroku nic nie wie.

Edgar Ortega
źródło
1

Edytuj package.json:

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

i Server.js:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
Naveen Kumar V.
źródło
W moim przypadku wyjąłem tę część package.json. Uważam, że aktualizacja powinna rozwiązać ten problem.
Mark
1

Miałem ten sam problem, ponieważ nie zdefiniowałem Procfile. Zatwierdź plik tekstowy do katalogu głównego aplikacji o nazwie Procfile bez rozszerzenia pliku. Ten plik informuje Heroku, które polecenia należy uruchomić, aby uruchomić aplikację.

web: node app.js
AmirRezaM75
źródło
Dzięki, zapomniałem to zrobić. Bez tego pliku heroku po prostu całkowicie ignoruje pliki.
Vladimir Despotovic
0

Miałem ten sam problem, który mogłem rozwiązać, zastępując „localhost” adresem IP o wartości „0.0.0.0”

Damith Asanka
źródło
0

Stałej liczby nie można ustawić dla portu, heroku przypisuje ją dynamicznie za pomocą process.env.PORT. Ale możesz dodać je oba, w ten sposób process.env.PORT || 5000. Heroku użyje pierwszego, a lokalny host użyje drugiego.

Możesz nawet dodać funkcję oddzwaniania. Spójrz na kod poniżej

app.listen(process.env.PORT || 5000, function() {
    console.log("Server started.......");
});
Aminu Kano
źródło
0

Przy wszystkich rozwiązaniach, których nie próbowałem, aby nikt nie działał zgodnie z oczekiwaniami, domyślnie badam heroku. Plik .env powinien zachować konwencję PORT, proces.env.PORT, domyślnie heroku szuka słowa kluczowego PORT.

Anuluj wszelkie zmiany nazw, takie jak APP_PORT = zamiast tego użyj PORT = w pliku env.

Delino
źródło
0

Z procesu bash heroku przekaż wartość $ PORT do aplikacji węzła za pomocą parsera opcji, takiego jak yargs.

Oto przykład, jak możesz to zrobić. Na obiekcie skryptów w pakiecie.json dodaj metodę początkową „serwer węzłów - port $ PORT”.

W pliku serwera użyj yargs, aby uzyskać wartość z opcji portu (--port $ PORT) metody startowej:

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

Teraz, gdy aplikacja się uruchomi, połączy się z dynamicznie ustawioną wartością $ PORT.

Aori Nevo
źródło
0

Jeśli, podobnie jak ja, konfigurujesz Heroku do uruchamiania skryptu z package.jsonpliku podczas wdrażania, upewnij się, że nie zapisałeś wartości PORTtego skryptu! Jeśli to zrobisz, skończysz jak ja i spędzisz godzinę, próbując dowiedzieć się, dlaczego pojawia się ten błąd.

Chris
źródło
0

Miałem ten sam problem, ale z ekspresowym i serwerem Apollo. Rozwiązanie stąd :

Jedynym szczególnym zagadnieniem, które należy wziąć pod uwagę, jest umożliwienie heroku wyboru portu, na którym serwer jest wdrażany. W przeciwnym razie mogą wystąpić błędy, takie jak przekroczenie limitu czasu żądania.

Aby skonfigurować serwer apollo do korzystania z portu zdefiniowanego przez Heroku w czasie wykonywania, funkcję nasłuchiwania w pliku instalacyjnym można wywołać z portem zdefiniowanym przez zmienną środowiskową PORT:

> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });
Antony Petrocelli
źródło
0

W moim przypadku miałem dwa problemy ...

1) brak nasłuchiwania ze względu na uruchomienie aplikacji z innego pliku wejściowego i ten skrypt uruchamiania został usunięty z „skryptów” pakietu.json

wprowadź opis zdjęcia tutaj

2) Problem z rozróżnianiem wielkości liter w przypadku „Sequelize” zamiast „sequelize”

wprowadź opis zdjęcia tutaj

Elmatsidis Paul
źródło
0

Używam ReactJs, jeśli chcesz przesłać do heroku, dodaj to do swojego webpack.config.js

Ponieważ jeśli nie dodasz, będziesz miał błąd

Błąd R10 (Limit czasu rozruchu) -> Proces WWW nie powiązał się z $ PORT w ciągu 60 sekund od uruchomienia

//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
 })
 ]
};
NUR CHULIS
źródło
0

W moim przypadku ani port, ani host nie stanowiły problemu. index.jsZostał podzielony na 2 plików. 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)
});

od package.jsonuciekliśmy node app.js.

Najwyraźniej to był problem. Po połączeniu obu w jeden plik aplikacja Heroku została wdrożona zgodnie z oczekiwaniami.

jonyB
źródło
0

Mój problem polegał na tym, że podczas wdrażania do heroku wystąpił błąd:

Proces sieciowy nie mógł się połączyć z $ PORT w ciągu 60 sekund od uruchomienia

podczas pracy heroku logs --tailw terminalu. ALE aplikacja będzie działać zgodnie z oczekiwaniami, gdy uruchomię serwer lokalnie.

Miałem to w swoim index.jspliku (plik serwera)

const PORT = process.env.port || 4000

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

Ale powinienem to mieć

const PORT = process.env.PORT || 4000

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

Używaj process.env.PORTnie process.env.port, bo portto nie to samo, co PORToczywiście.

Kredyt dla gprasanta .

Josh Kardos
źródło
0

Zdałem sobie sprawę, że nie potrzebuję numeru portu w punkcie końcowym żądania, więc punkt końcowy był herokuapp.comi nieherokuapp.com:5000 .

listen()Połączenie może być bez gospodarza i zwrotnego:

server.listen(5000);
Shai Fisher
źródło
Nie potrzebujesz numeru portu w adresie URL, jeśli używasz portu domyślnego. Jak to rozwiązuje problem?
RalfFriedl