Error de Heroku + node.js (el proceso web no pudo vincularse a $ PORT dentro de los 60 segundos posteriores al lanzamiento)

447

Tengo mi primera aplicación node.js (funciona bien localmente), pero no puedo implementarla a través de heroku (la primera vez también con heroku). El código está abajo. SO no me deja escribir tanto código, por lo que solo diría que ejecutar el código localmente dentro de mi red no muestra ningún 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/');

Alguna idea ?

usuario428900
fuente
¿Puedes publicar tu código aquí? Preferiblemente la parte .listen () si está iniciando un servidor http
Benjamin Gruenbaum

Respuestas:

988

Heroku asigna dinámicamente un puerto a su aplicación, por lo que no puede establecer el puerto en un número fijo. Heroku agrega el puerto al entorno, para que pueda sacarlo de allí. Cambie su escuchar esto:

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

De esa manera, seguirá escuchando el puerto 5000 cuando realice la prueba localmente, pero también funcionará en Heroku.

Puede consultar los documentos de Heroku en Node.js aquí .

venganza roja
fuente
96
importante que use process.env.PORT y no process.env.port.
gprasant
¡hermoso! funcionó para mí con el módulo 'websocket'.
philx_x
1
Gracias por ahorrarme tiempo.
allsoft
2
Gracias, funcionó para mí también. Me sorprende que esto no se haya
aclarado
34

El error ocurre cuando Heroku no pudo vincular el puerto o el nombre de host en server.listen(port, [host], [backlog], [callback]).

Lo que Heroku requiere es .listen(process.env.PORT)o.listen(process.env.PORT, '0.0.0.0')

De manera más genérica, para admitir otros entornos, use esto:

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
fuente
66
Con la siguiente llamada: app.listen (serverPort, "localhost", function (err) {Heroku estaba fallando. Cambiar "localhost" a "0.0.0.0" ayudó. ¡Gracias!
pubsy
31

Vale la pena mencionar que si su código no especifica un puerto, entonces no debería ser un webproceso y probablemente debería ser un workerproceso en su lugar.

Entonces, cambie su Procfilelectura (con su comando específico completado):

worker: YOUR_COMMAND

y luego también se ejecuta en CLI:

$ heroku scale worker=1

zthomas.nc
fuente
1
Tuve el mismo problema que pude resolver al reemplazar 'localhost' por IP que es '0.0.0.0'
Damith Asanka
2
Estoy ejecutando un bot de Discord en Heroku, y esto me dejó sin aliento. Los bots Slack, Hipchat, etc. probablemente podrían tener problemas similares.
Skylar
1
Si sigue esta ruta, asegúrese de ir a la pestaña Recursos, apague el proceso web y active el proceso de trabajo. De esa manera, Heroku no esperará un enlace de puerto.
Isaac Lyman
1
Ohh muchas gracias Me volví loco tratando de buscar esto. No tenía idea de que las aplicaciones web y de trabajo diferían en Heroku en términos del Procfile. Vale la pena mencionar que me necesitaban para agregar un startscript en mipackage.json
Rishav
1
En mi caso, cambié el archivo de perfil de web a trabajador. ¡¡Funcionó!! Thkns
rodrigorf
27

Tuve el mismo problema al usar el proyecto generado por la pila completa angular de yeoman y eliminar el parámetro IP funcionó para mí.

Reemplacé 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'));
});

con

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

Para aquellos que pasan tanto un puerto como un host, tenga en cuenta que Heroku no se unirá localhost .

Debe pasar 0.0.0.0 por el host.

Incluso si está utilizando el puerto correcto. Tuvimos que hacer este 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;

Luego puede iniciar el servidor, como de costumbre:

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

Puede ver más detalles aquí: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

gregb
fuente
3
Esta respuesta no solo es más completa, sino la única que apuntó a los dos posibles problemas. En mi caso, la configuración del puerto era correcta, pero no la dirección de escucha. Esta debería ser la respuesta aceptada.
Danielo515
En mi caso, funciona como lo cambio a continuación const port = 3000;para const port = process.env.PORT || 3000; que funcione en heroku
vpgodara
lo único que realmente funcionó para mí, gracias
Ibrahim Mohammed
10

En mi caso, estaba usando un ejemplo de https://hapijs.com/

Para solucionar el problema reemplacé

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

con

server.connection({
    port: process.env.PORT || 3000 
});
nexuzzz
fuente
y para aquellos de uso especificando process.env.PORTcorrectamente, pero dejando en el hostparámetro: no puedes :) ver aquí: stackoverflow.com/a/34956330/626369
Dominick
3

Tuve el mismo problema y cambiar mi puerto de escucha de 3000 a (process.env.PORT || 5000) resolvió el problema.

Akshata Dabade
fuente
2

En mi caso, estaba usando Babel con el complemento babel-plugin-transform-inline-environment-variables . Aparentemente, Heroku no establece la variable env del PUERTO cuando realiza una implementación, por process.env.PORTlo que será reemplazado por undefined, y su código recurrirá al puerto de desarrollo del que Heroku no sabe nada.

Edgar Ortega
fuente
1

Los siguientes pasos resolvieron mi solución:

Edición de package.json como:

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

y 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
fuente
En mi caso saqué esa parte de la package.json. Creo que actualizarlo también debería resolver este problema.
Marcar el
1

Tuve el mismo problema porque no definí Procfile. Confirme un archivo de texto en el directorio raíz de su aplicación que se llama Procfile sin una extensión de archivo. Este archivo le dice a Heroku qué comando (s) ejecutar para iniciar su aplicación.
web: node app.js

AmirRezaM75
fuente
Gracias, olvidé hacer esto. Sin este archivo, el heroku simplemente ignora los archivos por completo.
Vladimir Despotovic
0

Tuve el mismo problema que pude resolver con reemplazar 'localhost' con IP que es '0.0.0.0'

Damith Asanka
fuente
0

No se puede establecer un número fijo para el puerto, heroku lo asigna dinámicamente usando process.env.PORT. Pero puedes agregarlos a ambos, así process.env.PORT || 5000. Heroku usará el primero, y su localhost usará el segundo.

Incluso puede agregar su función de devolución de llamada. Mira el código a continuación

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

De todas las soluciones que he intentado, nadie funciona como se esperaba, estudio heroku por defecto, el archivo .env debe mantener la convención PORT, el proceso.env.PORT, heroku buscará por defecto la palabra clave PORT.

Cancele cualquier cambio de nombre como APP_PORT = en su lugar use PORT = en su archivo env.

Delino
fuente
0

Desde el proceso heroku bash, transfiera el valor de $ PORT a su aplicación de nodo utilizando un analizador de opciones como hilos.

Aquí hay un ejemplo de cómo podrías hacer eso. En el objeto de secuencias de comandos, dentro de package.json, agregue un método de inicio "servidor de nodo --port $ PORT".

En su archivo de servidor, use yargs para obtener el valor de la opción de puerto (--port $ PORT) del método de inicio:

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

Ahora, cuando se inicia su aplicación, se unirá al valor establecido dinámicamente de $ PORT.

Aori Nevo
fuente
0

Si, como yo, está configurando a Heroku para ejecutar un script desde su package.jsonarchivo en la implementación, ¡asegúrese de no haber codificado el valor de PORTese script! Si lo hace, terminará como yo y pasará una hora tratando de descubrir por qué está recibiendo este error.

Chris
fuente
0

Tuve el mismo problema pero con express y apollo-server. La solución desde aquí :

La única consideración especial que debe hacerse es permitir que heroku elija el puerto en el que se implementa el servidor. De lo contrario, puede haber errores, como un tiempo de espera de solicitud.

Para configurar apollo-server para usar un puerto definido por Heroku en tiempo de ejecución, la función de escucha en su archivo de configuración se puede llamar con un puerto definido por la variable de entorno PORT:

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

En mi caso tuve dos problemas ...

1) no escucha en absoluto debido a la ejecución de la aplicación desde otro archivo de entrada y este script de ejecución se eliminó de los "scripts" de package.json

ingrese la descripción de la imagen aquí

2) Problema sensible a mayúsculas y minúsculas con 'Sequelize' en lugar de 'sequelize'

ingrese la descripción de la imagen aquí

Elmatsidis Paul
fuente
0

Yo tuve el mismo problema. Finalmente, me di cuenta de que no necesito el número de puerto en el punto final de la solicitud. (entonces el punto final fue https: //...herokuapp.com y no https: //...herokuapp.com: 5000 ).

La llamada listen () puede ser sin host y devolución de llamada: server.listen (5000);

Shai Fisher
fuente
No necesita el número de puerto en la URL si usa el puerto predeterminado. Entonces, ¿cómo resuelve eso el problema?
RalfFriedl
0

En mi caso, ni el puerto ni el host fueron el problema. Nuestro index.js se dividió en 2 archivos 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)
});

desde package.json ejecutamos el nodo app.js

Aparentemente ese era el problema. Una vez que combiné los dos en un archivo, la aplicación heroku se implementó como se esperaba.

Espero que ayude a alguien ya que no he encontrado a nadie que haya encontrado este problema

jonyB
fuente
0

Uso ReactJs, si quieres subirlo a heroku agrega esto en tu webpack.config.js

Porque si no agregas tendrás error

Error R10 (Tiempo de espera de inicio) -> El proceso web no pudo vincularse a $ PORT dentro de los 60 segundos posteriores al inicio

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

Crédito a: gprasant

Solo quiero volver a publicar esto porque esta respuesta solucionó mi problema. Mi problema fue que al implementarlo en heroku recibí un error "El proceso web no pudo vincularse a $ PORT dentro de los 60 segundos posteriores al lanzamiento" al ejecutar "heroku logs --tail" en el terminal. PERO la aplicación se ejecutará como se esperaba cuando ejecuté el servidor localmente.

Tenía esto en mi archivo index.js (archivo de servidor)

const PORT = process.env.port || 4000

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

Pero debería haber tenido esto

const PORT = process.env.PORT || 4000

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

Use process.env.PORT no process.env.port !!!! puerto! = PUERTO !!! (obviamente)

Crédito a: gprasant

Josh Kardos
fuente