Erro Heroku + node.js (o processo da Web falhou ao vincular a $ PORT dentro de 60 segundos após o lançamento)

447

Eu tenho meu primeiro aplicativo node.js (funciona bem localmente) - mas não consigo implantá-lo via heroku (pela primeira vez com o heroku também). O código está abaixo. O SO não me permite escrever tanto código, então eu diria que a execução local do código também na minha rede não apresenta problemas.

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

Qualquer ideia ?

user428900
fonte
Você pode postar seu código aqui? De preferência a parte .listen () se você estiver iniciando um servidor http
Benjamin Gruenbaum 28/03

Respostas:

987

O Heroku atribui dinamicamente ao seu aplicativo uma porta, para que você não possa defini-la como um número fixo. O Heroku adiciona a porta ao ambiente, para que você possa puxá-la de lá. Mude sua escuta para isso:

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

Dessa forma, ele ainda escutará a porta 5000 quando você testar localmente, mas também funcionará no Heroku.

Você pode conferir os documentos do Heroku no Node.js aqui .

redhotvengeance
fonte
96
É importante que você use process.env.PORT e não process.env.port.
gprasant
bonita! trabalhou para mim com o módulo 'websocket'.
22415 philip_x
1
Obrigado por economizar meu tempo.
Allsoft
2
Obrigado, trabalhou para mim também. Estou surpreso que isso não tenha sido
esclarecido nos
34

O erro ocorre quando o Heroku falha ao vincular a porta ou o nome do host em server.listen(port, [host], [backlog], [callback]).

O que a Heroku exige é .listen(process.env.PORT)ou.listen(process.env.PORT, '0.0.0.0')

Portanto, de maneira mais genérica, para oferecer suporte a outros ambientes, use o seguinte:

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
fonte
6
Com seguinte chamada: app.listen (serverPort, "localhost", function (err) {Heroku estava falhando Switching "localhost" para "0.0.0.0" ajudou Graças..!
pubsy
31

Vale ressaltar que, se o seu código não especificar uma porta, não deverá ser um webprocesso e provavelmente deve ser um workerprocesso.

Portanto, altere seu Procfilepara ler (com seu comando específico preenchido):

worker: YOUR_COMMAND

e também execute na CLI:

$ heroku scale worker=1

zthomas.nc
fonte
1
Eu tive mesmo problema que eu poderia resolver problema com substituir 'localhost' com IP que é '0.0.0.0'
Damith Asanka
2
Estou executando um bot Discord no Heroku, e isso me deixou louco. Os bugs do Slack, Hipchat etc. provavelmente podem ter problemas semelhantes.
Skylar
1
Se você seguir esse caminho, vá para a guia Recursos, desative o processo da Web e ative o processo do trabalhador. Dessa forma, o Heroku não espera uma ligação de porta.
Isaac Lyman
1
Ohh, muito obrigado. Eu fiquei louco tentando procurar isso. Eu não imaginava que os aplicativos da Web e do trabalhador diferissem no Heroku em termos do Procfile. Vale a pena mencionar que eles precisavam de mim para adicionar um startroteiro na minhapackage.json
Rishav
1
No meu caso, mudei o procfile de web para worker. Funcionou!! Thkns
rodrigorf
27

Eu tive o mesmo problema ao usar o projeto gerado pelo angular-fullstack da yeoman e remover o parâmetro IP funcionou para mim.

Eu substituí este código

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

com

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

Para aqueles que estão passando por uma porta e um host, lembre-se de que o Heroku não fará a ligação localhost .

Você deve passar 0.0.0.0 pelo host.

Mesmo se você estiver usando a porta correta. Tivemos que fazer esse ajuste:

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

Então você pode iniciar o servidor, como de costume:

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

Você pode ver mais detalhes aqui: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

gregb
fonte
3
Essa resposta não é apenas mais completa, mas a única que abordou os dois possíveis problemas. No meu caso, a configuração da porta estava correta, mas não o endereço de escuta. Essa deve ser a resposta aceita.
Danielo515
No meu caso, ele funciona conforme eu const port = 3000;const port = process.env.PORT || 3000;
altero
a única coisa que realmente funcionou para mim, obrigado
Ibrahim Mohammed
10

No meu caso, eu estava usando o exemplo de https://hapijs.com/

Para corrigir o problema, substituí

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

com

server.connection({
    port: process.env.PORT || 3000 
});
nexuzzz
fonte
e para aqueles de uso especificando process.env.PORTcorretamente, mas deixando no hostparâmetro: você não pode :) veja aqui: stackoverflow.com/a/34956330/626369
Dominick
3

Eu tive o mesmo problema e alterar minha porta de escuta de 3000 para (process.env.PORT || 5000) resolveu o problema !!

Akshata Dabade
fonte
2

No meu caso, eu estava usando o Babel com o plug-in babel-plugin-transform-inline-environment-variables . Aparentemente, o Heroku não define a variável env env ao fazer uma implantação; portanto, process.env.PORTela será substituída por undefinede seu código retornará à porta de desenvolvimento da qual a Heroku não conhece nada.

Edgar Ortega
fonte
1

As etapas abaixo resolveram minha solução:

Editando package.json como:

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

e Server.js como:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
Naveen Kumar V
fonte
No meu caso, tirei essa parte do package.json. Acredito que atualizá-lo também deve resolver esse problema.
Mark
1

Eu tive o mesmo problema porque não defini o Procfile. Confirme um arquivo de texto no diretório raiz do seu aplicativo chamado Procfile sem uma extensão de arquivo. Esse arquivo informa ao Heroku quais comandos executar para iniciar seu aplicativo.
web: node app.js

AmirRezaM75
fonte
Obrigado, esqueci de fazer isso. Sem esse arquivo, o heroku simplesmente ignora os arquivos completamente.
Vladimir Despotovic
0

Eu tive o mesmo problema e resolvi o problema com a substituição de 'localhost' pelo IP, que é '0.0.0.0'

Damith Asanka
fonte
0

Um número fixo não pode ser definido para a porta, o heroku o atribui dinamicamente usando process.env.PORT. Mas você pode adicionar os dois, assim process.env.PORT || 5000. Heroku usará o primeiro e seu host local usará o segundo.

Você pode até adicionar sua função de retorno de chamada. Veja o código abaixo

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

Em toda a solução, tentei que ninguém funcionasse conforme o esperado, estudo heroku por padrão, o arquivo .env deve manter a convenção PORT, o processo.env.PORT, heroku por padrão, procurará a palavra-chave PORT.

Cancele qualquer renomeação, como APP_PORT =, em vez disso, use PORT = no seu arquivo env.

Delino
fonte
0

No processo heroku bash, transmita o valor de $ PORT para o aplicativo do nó usando um analisador de opções como yargs.

Aqui está um exemplo de como você pode fazer isso. No objeto scripts, dentro de package.json, adicione um método start "node server --port $ PORT".

No arquivo do servidor, use yargs para obter o valor da opção port (--port $ PORT) do método 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.
});

Agora, quando o aplicativo for iniciado, ele será vinculado ao valor definido dinamicamente de $ PORT.

Aori Nevo
fonte
0

Se, como eu, você estiver configurando o Heroku para executar um script a partir do seu package.jsonarquivo na implantação, verifique se não codificou o valor PORTdesse script! Se fizer isso, você terminará como eu e passará uma hora tentando descobrir por que está recebendo esse erro.

Chris
fonte
0

Eu tive o mesmo problema, mas com express e apollo-server. A solução daqui :

A única consideração especial que precisa ser feita é permitir que o heroku escolha a porta na qual o servidor está implantado. Caso contrário, pode haver erros, como um tempo limite de solicitação.

Para configurar o apollo-server para usar uma porta definida pelo Heroku em tempo de execução, a função de escuta no arquivo de configuração pode ser chamada com uma porta definida pela variável de ambiente PORT:

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

No meu caso, tive dois problemas ...

1) nenhum ouvinte por causa da execução do aplicativo de outro arquivo de entrada e esse script de execução foi excluído do package.json "scripts"

insira a descrição da imagem aqui

2) Problema que diferencia maiúsculas de minúsculas com 'Sequelize' em vez de 'sequelize'

insira a descrição da imagem aqui

Elmatsidis Paul
fonte
0

Eu tive o mesmo problema. Eventualmente, percebi que não preciso do número da porta no endpoint da solicitação. (portanto, o terminal era https: //...herokuapp.com e não https: //...herokuapp.com: 5000 ).

A chamada listen () pode ser sem host e retorno de chamada: server.listen (5000);

Shai Fisher
fonte
Você não precisa do número da porta no URL se usar a porta padrão. Então, como isso resolve o problema?
RalfFriedl
0

No meu caso, nem a porta nem o host foram o problema. Nosso index.js foi dividido em 2 arquivos 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)
});

do package.json, executamos o nó app.js

Aparentemente, esse era o problema. Depois de combinar os dois em um arquivo, o aplicativo heroku foi implantado conforme o esperado.

Espero que ajude alguém, pois não encontrei ninguém que tenha encontrado esse problema

jonyB
fonte
0

Eu uso ReactJs, se você quiser fazer o upload para o heroku, adicione-o no seu webpack.config.js

Porque se não adicionar você terá erro

Erro R10 (Tempo limite de inicialização) -> O processo da Web falhou ao vincular a $ PORT dentro de 60 segundos após o lançamento

//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
fonte
0

Crédito para: gprasant

Eu só quero repassar isso porque esta resposta resolveu meu problema. Meu problema foi que, ao implantar no heroku, recebi o erro "O processo da Web falhou ao vincular ao $ PORT dentro de 60 segundos após o lançamento" ao executar "heroku logs --tail" no terminal. MAS o aplicativo seria executado conforme o esperado quando eu executei o servidor localmente.

Eu tinha isso no meu arquivo index.js (arquivo do servidor)

const PORT = process.env.port || 4000

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

Mas deveria ter tido isso

const PORT = process.env.PORT || 4000

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

Use process.env.PORT não process.env.port !!!! porta! = PORTA !!! (obviamente)

Crédito para: gprasant

Josh Kardos
fonte