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


447

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

Есть идеи ?


Можете ли вы разместить свой код здесь? Предпочтительно часть .listen (), если вы запускаете http-сервер
Бенджамин Грюнбаум,

Ответы:


991

Heroku динамически назначает вашему приложению порт, поэтому вы не можете установить для порта фиксированный номер. Heroku добавляет порт в env, так что вы можете вытащить его оттуда. Переключите ваш слушать это:

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

Таким образом, при локальном тестировании он все равно будет прослушивать порт 5000, но он также будет работать на Heroku.

Вы можете ознакомиться с документами Heroku на Node.js здесь .


97
важно, чтобы вы использовали process.env.PORT, а не process.env.port.
gprasant

прекрасный! работал для меня с модулем «websocket».
philx_x


2
Спасибо, у меня тоже работает. Я удивлен, что это не было
прояснено в

@redhotvengeance спасибо .. упомяните, что он чувствителен к регистру и сохраните день :)
Mahendran

34

Ошибка происходит, когда 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);
});

6
С помощью следующего вызова: app.listen (serverPort, "localhost", function (err) {Heroku не удалось. Помогло переключение "localhost" на "0.0.0.0". Спасибо!
pubsy

31

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

Итак, измените ваш Procfileна чтение (с указанием вашей конкретной команды):

worker: YOUR_COMMAND

а затем также запустить на CLI:

heroku scale worker=1

1
У меня была такая же проблема, я мог решить проблему с заменой «localhost» на IP, который равен «0.0.0.0»
Дамит Асанка

2
Я управляю ботом Discord на Heroku, и это заставило меня замолчать. Slack, Hipchat и т. Д. Боты могут иметь схожие проблемы.
Скайлар

1
Если вы идете по этому пути, обязательно перейдите на вкладку Ресурсы, выключите веб-процесс и включите рабочий процесс. Таким образом, Heroku не будет ожидать привязки порта.
Исаак Лиман

1
О, спасибо тебе большое. Я сошел с ума, пытаясь найти это. Я понятия не имел, что веб-приложения и рабочие приложения в Heroku отличаются от Procfile. Стоит отметить, что они нуждались во мне, чтобы добавить startсценарий в мойpackage.json
Rishav

1
В моем случае я изменил procfile с веб на рабочий. Это сработало!! Thkns
Родригорф

27

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

25

Для тех, кто проходит через порт и хост, имейте в виду, что Heroku не будет связываться с localhost .

Вы должны пройти 0.0.0.0 для хоста.

Даже если вы используете правильный порт. Мы должны были сделать эту корректировку:

# 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;

Затем вы можете запустить сервер, как обычно:

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

Вы можете увидеть более подробную информацию здесь: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error


3
Этот ответ не только более полный, но и единственный, нацеленный на две возможные проблемы. В моем случае конфигурация порта была правильной, но не адрес прослушивания. Это должен быть принятый ответ.
Danielo515

В моем случае это работает , как я изменяется следующим образом, const port = 3000;чтобы const port = process.env.PORT || 3000; он работает на Heroku
vpgodara

единственное, что действительно сработало для меня, спасибо
Ибрагим Мухаммед

10

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

Чтобы исправить проблему я заменил

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

с

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

и для тех, кто использует, process.env.PORTправильно указав , но оставляя в hostпараметре: вы не можете :) см. здесь: stackoverflow.com/a/34956330/626369
Доминик


2

В моем случае я использовал Babel с плагином babel-plugin-transform-inline-environment-variable . По-видимому, Heroku не устанавливает переменную PORT env при развертывании, поэтому process.env.PORTбудет заменен на undefined, и ваш код откатится к порту разработки, о котором Heroku ничего не знает.


1

Редактировать package.json:

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

и Server.js:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...

В моем случае я вынул эту часть package.json. Я считаю, что обновление должно также решить эту проблему.
Марк

1

У меня была та же самая проблема, потому что я не определял Procfile. Зафиксируйте текстовый файл в корневой каталог вашего приложения с именем Procfile без расширения файла. Этот файл сообщает Heroku, какие команды нужно запустить для запуска приложения.

web: node app.js

Спасибо, я забыл это сделать. Без этого файла heroku просто полностью игнорирует файлы.
Владимир Деспотович

0

У меня была та же проблема, я мог решить проблему с заменой «localhost» на IP, который равен «0.0.0.0»


0

Фиксированный номер не может быть установлен для порта, геройку назначает его динамически, используя process.env.PORT. Но вы можете добавить их обоих, вот так process.env.PORT || 5000. Heroku будет использовать первый, а ваш локальный хост будет использовать второй.

Вы даже можете добавить функцию обратного вызова. Посмотрите на код ниже

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

0

Из всех решений, которые я пробовал, никто не работал должным образом, я изучаю heroku по умолчанию. Файл .env должен поддерживать соглашение PORT, process.env.PORT, heroku по умолчанию будет искать ключевое слово PORT.

Отмените любое переименование, например APP_PORT =, вместо этого используйте PORT = в файле env.


0

Из процесса heroku bash передайте значение $ PORT вашему приложению-ноду, используя анализатор параметров, например yargs.

Вот пример того, как вы можете это сделать. В объекте scripts внутри package.json добавьте метод запуска "node server --port $ PORT".

В файле вашего сервера используйте yargs, чтобы получить значение из опции порта (--port $ PORT) метода start:

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

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


0

Если, как и я, вы настраиваете Heroku для запуска сценария из своего package.jsonфайла при развертывании, убедитесь, что вы не указали значение PORTэтого сценария жестко ! Если вы это сделаете, вы в конечном итоге, как я, и потратите час, пытаясь выяснить, почему вы получаете эту ошибку.


0

У меня была такая же проблема, но с экспрессом и сервером apollo. Решение отсюда :

Единственное особое внимание, которое необходимо сделать, - это разрешить герою выбрать порт, на котором развернут сервер. В противном случае могут возникнуть ошибки, например, тайм-аут запроса.

Чтобы настроить сервер apollo на использование порта, определенного Heroku во время выполнения, функцию прослушивания в вашем файле установки можно вызвать с портом, определенным переменной среды PORT:

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

0

В моем случае у меня было две проблемы ...

1) нет прослушивателя вообще из-за запуска приложения из другого входного файла, и этот скрипт запуска был удален из "скриптов" package.json

введите описание изображения здесь

2) Чувствительная к регистру проблема с «Sequelize» вместо «Sequelize»

введите описание изображения здесь


0

Я использую ReactJs, если вы хотите загрузить в heroku, добавьте это в ваш webpack.config.js

Потому что, если не добавить, у вас будет ошибка

Ошибка R10 (время загрузки) -> Веб-процессу не удалось привязаться к $ PORT в течение 60 секунд после запуска

//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
 })
 ]
};

0

В моем случае ни порт, ни хост не были проблемой. Он index.jsбыл разделен на 2 файла. 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)
});

от package.jsonмы побежали node app.js.

Видимо, это была проблема. Как только я объединил их в один файл, приложение Heroku развернулось, как и ожидалось.


0

Моя проблема заключалась в том, что при развертывании на героку я получил ошибку:

Веб-процессу не удалось привязаться к $ PORT в течение 60 секунд после запуска

при беге heroku logs --tail в терминале. НО приложение будет работать как положено, когда я запускаю сервер локально.

У меня было это в моем index.jsфайле (файл сервера)

const PORT = process.env.port || 4000

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

Но должен был иметь это

const PORT = process.env.PORT || 4000

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

Используйте process.env.PORT, нет process.env.port, потому что portэто не то же самое, чтоPORT очевидно.

Кредит на гпрасант .


0

Я понял, что мне не нужен номер порта в конечной точке запроса, поэтому конечная точка была herokuapp.comи неherokuapp.com:5000 .

listen()Вызов может быть без хозяина и обратного вызова:

server.listen(5000);

Вам не нужен номер порта в URL, если вы используете порт по умолчанию. Так как же это решить проблему?
Ральф Фридл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.