Error de Heroku + node.js (el proceso web no pudo vincularse a $PORT dentro de los 60 segundos posteriores al inicio)
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 heroku). El código está debajo. SO no me permite escribir tanto código, por lo que solo diría que ejecutar el código localmente y 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 ?
Heroku asigna dinámicamente un puerto a su aplicación, por lo que no puede configurar el puerto en un número fijo. Heroku agrega el puerto al env, para que puedas extraerlo desde allí. Cambia tu escucha a esto:
.listen(process.env.PORT || 5000)
De esa manera seguirá escuchando el puerto 5000 cuando realices pruebas localmente, pero también funcionará en Heroku. Nota importante : la palabra PORT debe estar en mayúscula.
Puede consultar los documentos de Heroku en Node.js aquí .
Vale la pena mencionar que si su código no especifica un puerto, entonces no debería ser un web
proceso y probablemente debería ser un worker
proceso.
Entonces, cambie su Procfile
para leer (con su comando específico completado):
worker: YOUR_COMMAND
y luego también ejecutar en CLI:
heroku scale worker=1
Para aquellos que pasan tanto un puerto como un host, tengan en cuenta que Heroku no se vinculará a localhost
.
Debes pasar 0.0.0.0
por anfitrión.
Incluso si estás usando 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 puedes iniciar el servidor, como de costumbre:
app.listen(port, host, function() {
console.log("Server started.......");
});
Puedes ver más detalles aquí: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error
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);
});