6

Ошибка Heroku + node.js (Веб-процесс не смог подключиться к $PORT в течение 60 секунд после запуска)

5

У меня есть первое приложение на 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 ответ(ов)

0

Стоит отметить, что если в вашем коде не указан порт, то это не должно быть веб-процессом, и, скорее всего, это должен быть процесс worker.

Поэтому измените ваш Procfile, чтобы он выглядел следующим образом (вставив вашу конкретную команду вместо YOUR_COMMAND):

worker: ВАША_КОНДЕНА

Затем также выполните в командной строке:

heroku scale worker=1
0

Для тех, кто передает и порт, и хост, имейте в виду, что 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

0

Ошибка возникает, когда 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, так и в других средах.

0

У меня была такая же проблема при использовании проекта, сгенерированного с помощью 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'));
});

После этого все заработало.

0

В вашем случае вы использовали пример из https://hapijs.com/.

Чтобы решить проблему, я заменил:

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

на

server.connection({
    port: process.env.PORT || 3000 
});

Таким образом, сервер будет слушать на порту, указанном в переменной окружения PORT, если она задана, иначе — на порту 3000.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь