node.js - nodejs - npm heroku
Heroku+node.js error(el proceso web no se pudo enlazar a $ PORT dentro de los 60 segundos posteriores al lanzamiento) (16)
Desde el proceso de heroku bash, transmita el valor de $ PORT a su aplicación de nodo usando un analizador de opciones como yargs.
Aquí hay un ejemplo de cómo podrías hacer eso. En el objeto de scripts, dentro de package.json, agregue un método de inicio "node server --port $ PORT".
En el archivo de su 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 inicie la aplicación, se vinculará al valor establecido dinámicamente de $ PORT.
Tengo mi primera aplicación node.js (funciona bien localmente), pero no puedo implementarla a través de heroku (también la primera vez con w / heroku). El código está abajo. SO no me permite 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 ?
El error ocurre cuando Heroku no pudo enlazar el puerto o el nombre de host en server.listen(port, [host], [backlog], [callback])
.
Lo que requiere Heroku es .listen(process.env.PORT)
o .listen(process.env.PORT, ''0.0.0.0'')
Así que de forma más genérica, para soportar otros entornos, usa 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);
});
En mi caso, estaba usando Babel con el plugin babel-plugin-transform-inline-environment-variables . Aparentemente, Heroku no configura la variable env del puerto cuando realiza una implementación, por lo que process.env.PORT
será reemplazado por undefined
, y su código se replegará al puerto de desarrollo del cual Heroku no sabe nada.
En mi caso, estaba usando el ejemplo de https://hapijs.com/
Para solucionar el problema he sustituido
server.connection({
host: ''localhost'',
port: 8000
});
con
server.connection({
port: process.env.PORT || 3000
});
En todas las soluciones, no he intentado que nadie funcione como se esperaba, estudio heroku de forma predeterminada. El archivo .env debe mantener el convenio PORT, el process.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.
Heroku asigna dinámicamente a su aplicación un puerto, por lo que no puede configurar el puerto en un número fijo. Heroku agrega el puerto a la env, para que puedas sacarla desde allí. Cambia tu escucha a esto:
.listen(process.env.PORT || 5000)
De esa manera, seguirá escuchando el puerto 5000 cuando realice pruebas locales, pero también funcionará en Heroku.
Puedes ver los documentos de Heroku en Node.js here .
No se puede establecer un número fijo para el puerto, heroku lo asigna dinámicamente usando process.env.PORT
. Pero puede agregarlos a ambos, como este process.env.PORT || 5000
process.env.PORT || 5000
. Heroku usará el primero, y su proveedor local usará el segundo.
Incluso puede agregar su función de devolución de llamada. Mira el código de abajo
app.listen(process.env.PORT || 5000, function() {
console.log("Server started.......");
});
Para aquellos que están pasando tanto un puerto como un host, tenga en cuenta que Heroku no se unirá a localhost
.
Debe pasar 0.0.0.0
para 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;
A continuación, 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
Si, como yo, está configurando Heroku para ejecutar un script desde su archivo package.json
en el despliegue, ¡asegúrese de no haber codificado el valor de PORT
en ese script! Si lo hace, terminará como yo y pasará una hora tratando de averiguar por qué está recibiendo este error.
Tuve el mismo problema mientras utilizaba el proyecto generado por la compilación de ángulos completos de yeoman y eliminaba el parámetro IP que funcionaba para mí.
Reemplacé este codigo
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''));
});
Tuve el mismo problema pero con express y apollo-server. La solución desde here :
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 el servidor apollo para que use un puerto definido por Heroku en tiempo de ejecución, se puede llamar a la función de escucha en su archivo de configuración 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}`); });
Tuve el mismo problema porque no definí Procfile. Confirme un archivo de texto en el directorio raíz de su aplicación que se denomina 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
Tuve el mismo problema que podría resolver el problema con reemplazar ''localhost'' con IP que es ''0.0.0.0''
Tuve el mismo problema y cambiar mi puerto de escucha de 3000 a (process.env.PORT || 5000) solucionó el problema !!
Vale la pena mencionar que si su código no especifica un puerto, entonces no debería ser un proceso web
y probablemente debería ser un proceso de worker
lugar.
Por lo tanto, cambie su Procfile
para leer (con su comando específico completado):
worker: YOUR_COMMAND
y luego también se ejecuta en CLI:
$ heroku scale worker=1
Los siguientes pasos resolvieron mi solución:
Editando 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");
});
...