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ł ?
Odpowiedzi:
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:
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 .
źródło
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:
źródło
Warto wspomnieć, że jeśli twój kod nie określa portu, to nie powinien to być
web
proces i prawdopodobnie powinien to byćworker
proces.Więc zmień swój
Procfile
na czytający (z wypełnionym konkretnym poleceniem):a następnie uruchom także na CLI:
źródło
start
skryptu w moimpackage.json
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
z
źródło
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:
Następnie możesz uruchomić serwer, jak zwykle:
Możesz zobaczyć więcej szczegółów tutaj: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error
źródło
const port = 3000;
abyconst port = process.env.PORT || 3000;
działało na herokuW moim przypadku korzystałem z przykładu z https://hapijs.com/
Aby naprawić problem, wymieniłem
z
źródło
process.env.PORT
poprawnie, ale pozostawiając whost
parametrze: nie możesz :) zobacz tutaj: stackoverflow.com/a/34956330/626369Zmiana portu nasłuchiwania z 3000, aby
(process.env.PORT || 5000)
rozwiązać problem.źródło
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.PORT
zostanie zastąpiona przezundefined
, a twój kod wróci do portu programistycznego, o którym Heroku nic nie wie.źródło
Edytuj
package.json
:i
Server.js
:źródło
package.json
. Uważam, że aktualizacja powinna rozwiązać ten problem.Miałem ten sam problem, ponieważ nie zdefiniowałem
Procfile
. Zatwierdź plik tekstowy do katalogu głównego aplikacji o nazwieProcfil
e bez rozszerzenia pliku. Ten plik informuje Heroku, które polecenia należy uruchomić, aby uruchomić aplikację.źródło
Miałem ten sam problem, który mogłem rozwiązać, zastępując „localhost” adresem IP o wartości „0.0.0.0”
źródło
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óbprocess.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
źródło
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.
źródło
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:
Teraz, gdy aplikacja się uruchomi, połączy się z dynamicznie ustawioną wartością $ PORT.
źródło
Jeśli, podobnie jak ja, konfigurujesz Heroku do uruchamiania skryptu z
package.json
pliku podczas wdrażania, upewnij się, że nie zapisałeś wartościPORT
tego skryptu! Jeśli to zrobisz, skończysz jak ja i spędzisz godzinę, próbując dowiedzieć się, dlaczego pojawia się ten błąd.źródło
Miałem ten sam problem, ale z ekspresowym i serwerem Apollo. Rozwiązanie stąd :
źródło
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
2) Problem z rozróżnianiem wielkości liter w przypadku „Sequelize” zamiast „sequelize”
źródło
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
źródło
W moim przypadku ani port, ani host nie stanowiły problemu.
index.js
Został podzielony na 2 plików.server.js
:od
package.json
uciekliśmynode app.js
.Najwyraźniej to był problem. Po połączeniu obu w jeden plik aplikacja Heroku została wdrożona zgodnie z oczekiwaniami.
źródło
Mój problem polegał na tym, że podczas wdrażania do heroku wystąpił błąd:
podczas pracy
heroku logs --tail
w terminalu. ALE aplikacja będzie działać zgodnie z oczekiwaniami, gdy uruchomię serwer lokalnie.Miałem to w swoim
index.js
pliku (plik serwera)Ale powinienem to mieć
Używaj
process.env.PORT
nieprocess.env.port
, boport
to nie to samo, coPORT
oczywiście.Kredyt dla gprasanta .
źródło
Zdałem sobie sprawę, że nie potrzebuję numeru portu w punkcie końcowym żądania, więc punkt końcowy był
herokuapp.com
i nieherokuapp.com:5000
.listen()
Połączenie może być bez gospodarza i zwrotnego:źródło