Помилка Heroku + node.js (веб-процес не вдалося прив’язати до $ PORT протягом 60 секунд після запуску)


447

У мене є перший додаток node.js (працює нормально локально), але я не в змозі розгорнути його через heroku (перший раз також / heroku). Код нижче. Так що я не дозволяю мені писати так багато коду, тому я просто скажу, що запуск коду локально, а також у моїй мережі не викликає проблем.

 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-сервер
Бенджамін Груенбаум

Відповіді:


989

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]).

Те, що вимагає Хероку, є .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", функція (помилка) {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
Рішав

1
У моєму випадку я змінив профайл з веб на робочий. Це спрацювало!! Thkns
rodrigorf

27

У мене була така ж проблема, коли я використовував проект, створений у кутовій та fullstack yeoman та видаляючи 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

Для тих, хто проходить як порт, так і хост, майте на увазі, що Героку не пов'язуватиме 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-variables . Мабуть, 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

Фіксований номер не може бути встановлений для порту, heroku призначає його динамічно, використовуючи process.env.PORT. Але ви можете додати їх і те, і інше process.env.PORT || 5000. Heroku використовуватиме перший, а ваш localhost використовуватиме другий.

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

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.

Ось приклад того, як ви могли це зробити. На об’єкт скриптів всередині package.json додайте метод запуску "сервер вузлів - порт $ PORT".

У файлі сервера використовуйте yargs, щоб отримати значення з параметра порту (--port $ PORT) методу запуску:

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-сервером. Рішення звідси :

Єдине особливе врахування, на яке потрібно звернути увагу, - це дозволити heroku вибрати порт, на якому розміщений сервер. В іншому випадку можуть виникнути помилки, наприклад, час очікування запиту.

Щоб налаштувати 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

Моя проблема полягала в тому, що при розгортанні в heroku я отримав помилку:

Веб-процес не вдалося прив’язати до $ 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очевидно.

Кредит gprasant .


0

Я зрозумів, що мені номер порта в кінцевій точці запиту не потрібен, тому кінцева точка була herokuapp.comі ніherokuapp.com:5000 .

listen()Виклик може бути без господаря і на зворотний дзвінок:

server.listen(5000);

Вам не потрібен номер порту в URL-адресі, якщо ви використовуєте порт за замовчуванням. То як це вирішує проблему?
RalfFriedl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.