Ошибка Heroku + node.js(веб-процесс не смог привязываться к $PORT в течение 60 секунд после запуска)
У меня есть мое первое приложение node.js(выполняется нормально локально), но я не могу его развернуть с помощью героку (в первый раз с геройкой). Код ниже. 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/');
Любая идея?
Ответы
Ответ 1
Heroku динамически назначает вашему приложению порт, поэтому вы не можете установить для порта фиксированный номер. Heroku добавляет порт в env, так что вы можете вытащить его оттуда. Переключите свое прослушивание на это:
.listen(process.env.PORT || 5000)
Таким образом, при локальном тестировании он все равно будет прослушивать порт 5000, но он также будет работать на Heroku.
Вы можете ознакомиться с документами Heroku на Node.js здесь.
Ответ 2
У меня была такая же проблема при использовании проекта yoman 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'));
});
Ответ 3
Ошибка происходит, когда 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);
});
Ответ 4
Стоит отметить, что если в вашем коде не указан порт, то он не должен быть web
процессом и, вероятно, должен быть worker
процессом.
Итак, измените ваш Procfile
на следующий (с указанием вашей конкретной команды):
worker: YOUR_COMMAND
а затем также запустить на CLI:
$ heroku scale worker=1
Ответ 5
Для тех, кто проходит через порт и хост, имейте в виду, что 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
Ответ 6
В моем случае я использовал пример из https://hapijs.com/
Чтобы исправить проблему, которую я заменил
server.connection({
host: 'localhost',
port: 8000
});
с
server.connection({
port: process.env.PORT || 3000
});
Ответ 7
В моем случае я использовал Babel с плагином babel-plugin-transform-inline-environment-variables. По-видимому, Heroku не устанавливает переменную env PORT при развертывании, поэтому process.env.PORT
будет заменен на undefined
, и ваш код вернется в порт разработки, о котором Heroku ничего не знает.
Ответ 8
У меня была та же проблема, и изменение порта прослушивания с 3000 на (process.env.PORT || 5000) решило проблему !!
Ответ 9
Следующие шаги решили мое решение:
Редактирование 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");
});
...
Ответ 10
Из всех решений, которые я пробовал, никто не работал должным образом, я изучаю heroku по умолчанию. Файл .env должен поддерживать соглашение PORT, process.env.PORT, heroku по умолчанию будет искать ключевое слово PORT.
Отмените любое переименование, например APP_PORT =, вместо этого используйте PORT = в файле env.
Ответ 11
У меня была такая же проблема, я мог решить проблему с заменой "localhost" на IP, который равен "0.0.0.0"
Ответ 12
Фиксированное число не может быть установлено для порта, heroku назначает его динамически с помощью process.env.PORT
. Но вы можете добавить их оба, как этот process.env.PORT || 5000
. Heroku будет использовать первый, и ваш localhost будет использовать второй.
Вы даже можете добавить свою функцию обратного вызова. Посмотрите на код ниже
app.listen(process.env.PORT || 5000, function() {
console.log("Server started.......");
});
Ответ 13
Из процесса heroku bash передайте значение $ PORT вашему приложению-ноду, используя анализатор параметров, например yargs.
Вот пример того, как вы можете это сделать. В объекте scripts внутри package.json добавьте метод запуска "сервер узла --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.
Ответ 14
Если, как и я, вы настраиваете Heroku для запуска сценария из файла package.json
при развертывании, убедитесь, что вы не жестко запрограммировали значение PORT
в этом сценарии! Если вы это сделаете, вы в конечном итоге, как я, и потратите час, пытаясь выяснить, почему вы получаете эту ошибку.
Ответ 15
У меня была такая же проблема, но с Express и Apollo-сервером. Решение отсюда:
Единственное особое внимание, которое необходимо сделать, это разрешить герою выбирать порт, на котором развернут сервер. В противном случае могут возникнуть ошибки, например, тайм-аут запроса.
Чтобы настроить сервер apollo на использование порта, определенного Heroku во время выполнения, функцию прослушивания в вашем файле установки можно вызвать с портом, определенным переменной среды PORT:
> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => {
> console.log('Server ready at ${url}'); });
Ответ 16
У меня была та же проблема, потому что я не определил Procfile. Зафиксируйте текстовый файл в корневой каталог ваших приложений с именем Procfile без расширения файла. Этот файл сообщает Heroku, какие команды нужно запустить для запуска приложения.
web: node app.js
Ответ 17
В моем случае у меня было две проблемы...
1) нет прослушивателя вообще из-за запуска приложения из другого входного файла, и этот скрипт запуска был удален из package.json "scripts"
![enter image description here]()
2) Чувствительная к регистру проблема с "Sequelize" вместо "Sequelize"
![enter image description here]()
Ответ 18
I Use ReactJs
If you want upload to heroku add this in your webpack.config.js
Because if not add you will have
error
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
//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"
})
]
};
Ответ 19
У меня такая же проблема.
В конце концов, я понял, что мне не нужен номер порта в конечной точке запроса.
(поэтому конечная точка была https://...herokuapp.com, а не https://...herokuapp.com: 5000).
Вызов listen() может быть без хоста и обратного вызова: server.listen(5000);