Ошибка Heroku + node.js (Веб-процесс не смог подключиться к $PORT в течение 60 секунд после запуска)
У меня есть первое приложение на Node.js (локально работает отлично), но я не могу развернуть его через Heroku (это мой первый опыт с Heroku). Код приложения приведен ниже. Поскольку SO не позволяет мне писать много кода, упомяну, что при запуске кода локально в рамках моей сети проблем не возникает.
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/');
Есть ли идеи, как решить эту проблему?
5 ответ(ов)
Стоит отметить, что если в вашем коде не указан порт, то это не должно быть веб-процессом, и, скорее всего, это должен быть процесс worker
.
Поэтому измените ваш Procfile
, чтобы он выглядел следующим образом (вставив вашу конкретную команду вместо YOUR_COMMAND
):
worker: ВАША_КОНДЕНА
Затем также выполните в командной строке:
heroku scale worker=1
Для тех, кто передает и порт, и хост, имейте в виду, что Heroku не будет привязываться к localhost
.
Вы должны указать 0.0.0.0
в качестве хоста.
Даже если вы используете правильный порт. Нам пришлось внести следующие изменения:
// порт (как описано выше) и хост оба неверны
const host = 'localhost';
const port = 3000;
// используйте 0.0.0.0 и порт, который Heroku назначает переменной $PORT
const host = '0.0.0.0';
const port = process.env.PORT || 3000;
После этого вы сможете запустить сервер, как обычно:
app.listen(port, host, function() {
console.log("Сервер запущен.......");
});
Вы можете найти больше информации здесь: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error
Ошибка возникает, когда Heroku не удалось привязать порт или имя хоста в вызове server.listen(port, [host], [backlog], [callback])
.
Что требует Heroku, так это использование .listen(process.env.PORT)
или .listen(process.env.PORT, '0.0.0.0')
.
Чтобы обеспечить совместимость с другими окружениями, используйте следующий код:
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);
});
Таким образом, вы адаптируете свое приложение, чтобы оно корректно работало как на Heroku, так и в других средах.
У меня была такая же проблема при использовании проекта, сгенерированного с помощью Yeoman и angular-fullstack, и удаление параметра IP помогло мне.
Я заменил этот код:
server.listen(config.port, config.ip, function () {
console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
на
server.listen(config.port, function () {
console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
После этого все заработало.
В вашем случае вы использовали пример из https://hapijs.com/.
Чтобы решить проблему, я заменил:
server.connection({
host: 'localhost',
port: 8000
});
на
server.connection({
port: process.env.PORT || 3000
});
Таким образом, сервер будет слушать на порту, указанном в переменной окружения PORT, если она задана, иначе — на порту 3000.
В чем разница между --save и --save-dev?
Как в Node.js "подключить" функции из других файлов?
Node / Express: EADDRINUSE, адрес уже занят - как остановить процесс, использующий порт?
Как задать переменные окружения из файла package.json?
Как использовать исполняемые файлы из пакета, установленного локально в node_modules?