Ошибка 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/');
Любая идея?
42 ответа
Heroku динамически назначает вашему приложению порт, поэтому вы не можете установить для порта фиксированный номер. Heroku добавляет порт в env, так что вы можете вытащить его оттуда. Переключите ваш слушать это:
.listen(process.env.PORT || 5000)
Таким образом, при локальном тестировании он все равно будет прослушивать порт 5000, но он также будет работать на Heroku.
Вы можете ознакомиться с документами Heroku на Node.js здесь.
Стоит отметить, что если ваш код не указывает порт, то это не должно быть web
процесс и, вероятно, должен быть worker
процесс вместо
Итак, измените свой Procfile
читать (с указанием вашей конкретной команды):
worker: YOUR_COMMAND
а затем также запустить на CLI:
$ heroku scale worker=1
Для тех, кто проходит через порт и хост, имейте в виду, что 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
Ошибка происходит, когда 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);
});
У меня была та же проблема при использовании проекта 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'));
});
Изменить эту строку
app.listen(port);
к
app.listen(process.env.PORT, '0.0.0.0');
это сработает
В моем случае я использовал пример с https://hapijs.com/
Чтобы исправить проблему я заменил
server.connection({
host: 'localhost',
port: 8000
});
с
server.connection({
port: process.env.PORT || 3000
});
Хотя большинство ответов здесь действительны, для меня проблема заключалась в том, что я запускал длинные процессы как часть
npm run start
что вызвало тайм-аут.
Я нашел решение здесь, и, чтобы подвести итог, мне просто нужно было переместить
npm run build
к
postinstall
задача.
Другими словами, я изменил это:
"start": "npm run build && node server.js"
к этому:
"postinstall": "npm run build",
"start": "node server.js"
Если подумать, это имеет смысл, потому что эта ошибка (которая раньше появлялась время от времени) становилась все более и более распространенной, поскольку мое приложение продолжало расти.
У меня была та же проблема, и изменение порта прослушивания с 3000 на (process.env.PORT || 5000) решило проблему!!
У меня была та же проблема, потому что я не определил Procfile. Зафиксируйте текстовый файл в корневой каталог вашего приложения с именем Procfile без расширения файла. Этот файл сообщает Heroku, какие команды нужно запустить для запуска приложения.web: node app.js
Я понял, что мне не нужен номер порта в конечной точке запроса, поэтому конечная точка была herokuapp.com
и нет herokuapp.com:5000
.
В listen()
звонок может быть без хоста и обратного вызова:
server.listen(5000);
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”
})
]
};
В моем случае я использовал Babel с плагином babel-plugin-transform-inline-environment-variable. Очевидно, что Heroku не устанавливает переменную PORT env при развертывании, поэтому process.env.PORT
будет заменен на undefined
и ваш код откроется портом разработки, о котором Heroku ничего не знает.
Не уверен, что это сработает для всех, но вот что сработало для меня.
В вашем файле в
scripts
убедитесь, что ваш
start
сценарий содержит
$PORT
.
Пример
package.json
(в данном случае для приложения NextJS):
{
"private": true,
"scripts": {
"dev": "next dev -p 3001",
"build": "next build",
"start": "next start -p $PORT" // make sure to have $PORT in here
},
"dependencies": {
"typescript": "^4.3.2"
},
"devDependencies": {
"@next/eslint-plugin-next": "^11.1.2",
"@types/mongoose": "^5.11.97"
"typescript": "^4.3.2"
}
"license": "MIT"
}
Следующие шаги решили мое решение:
Редактирование 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");
});
...
Я потратил много часов, чтобы найти первопричину, и в конце концов обнаружил, что этот таймаут (60 секунд) можно регулировать. Здесь вы можете изменить 60 секунд на 120 или даже больше. У меня работает, надеюсь поможет кому-нибудь еще!
Чтобы решить эту проблему, выполните следующие четыре простых шага: в файле package.json:
1- установите основное поле в файл сервера:
"main": "server.js" // <-- here set you server file
2- добавить параметр хоста в функцию app.listen
const port = process.env.PORT || 3000;
const host = '0.0.0.0'
app.listen(port, host, ()=> connsole.log(`server is running on port ${port}`)
3- добавьте сценарий postinstall в файл package.json
"scripts": {
"postinstall": "npm run build", // <-- add this line
"start": "node server.js" // <-- change server.js to you main file
}
4- добавьте поле двигателей в файл package.json
"engines": {
"node": ">=14.0.O", // <-- change it to your node version. you can "node -v" in you command line
"npm": ">=7.7.0" // <-- change this to your npm version. you can use "npm -v" in the command line to get your npm version
}
дайте мне знать, если у вас есть какие-либо успехи с этим!
Использовать
process.env.PORT || 3000
для вашего порта.
Это будет использовать порт Heroku, если он доступен, или порт 3000, если он недоступен (например, локальное тестирование)
Вы можете изменить 3000 на все, что захотите, например 8080
Из всех решений, которые я пробовал, никто не работал должным образом, я изучаю heroku по умолчанию. Файл.env должен поддерживать соглашение PORT, process.env.PORT, heroku по умолчанию будет искать ключевое слово PORT.
Отмените любое переименование, например APP_PORT=, вместо этого используйте PORT = в файле env.
В моем случае я запускал сценарии базы данных при запуске и занимал много времени. Я решил это, запустив вручную
npm start
после завершения развертывания.
У меня такая же проблема, но переменные среды установлены правильно, а версия npm и node указана в package.json. Я понял, что это потому, что в моем случае Heroku нужно указать "start" в package.json:
"scripts": {
"start": "node index.js"
}
После добавления этого файла в мой package.json мое приложение узла успешно развернуто на Heroku.
У меня была такая же проблема, я мог решить проблему с заменой "localhost" на IP, который равен "0.0.0.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 развернулось, как и ожидалось.
Я работал с приложением Vue, используя vite , когда столкнулся с этой проблемой. Мойnpm run start
команда была определена как:
"scripts": {
"start": "vite --port 8080",
}
Объяснение было просрочено в этой ветке ответов, но я просто подумал предоставить синтаксис решения на случай, если кто-то еще его ищет:
"start": "vite --host '0.0.0.0' --port $PORT",
При разработке приложения нам необходимо определить ПОРТ следующим образом:
const port = process.env.PORT || 4000; // PORT must be in caps
И при развертывании приложения на сервере добавьте следующий метод:
app.listen(port, () => {
console.info("Server started listening.");
});
Мы можем передать имя хоста в качестве второго параметра при его локальном запуске. Но при развертывании на сервере параметр hostname следует удалить.
app.listen(port, hostName, () => {
console.info(`Server listening at http://${hostName}:${port}`);
});
У меня была похожая проблема, которую я пытался решить часами (H10 GET=/). Я попытался изменить ПОРТ, но безрезультатно. Оказалось, что решение было простым. Я изменил одну строку в файле package.json. От узла к узлу, и это сработало:
"scripts": {
"start": "nodemon app.js"
К:
"scripts": {
"start": "node app.js"
Я рекомендую вам очень внимательно прочитать журнал, чтобы легко его устранить. если вы ссылаетесь на ПОРТ как на переменную среды (env), убедитесь, что это не
port
потому что heroku автоматически назначает
PORT
номер вашего приложения при его развертывании.
process.env.PORT
нет
process.env.port
это тоже хороший способ устранить ошибку
const PORT = process.env.PORT || 3000
app.listen(
PORT,
'0.0.0.0',
function () {
console.log("Server started.......");
}
);
Если вы получаете эту ошибку и описанное выше не сработало, значит ошибка связана не с самим R10. Ошибка вызвана R14 (превышена квота памяти), и это связано с тем, что часть вашего кода использует multer (multer.diskStorage() метод) или какую-либо другую библиотеку для хранения изображений или других файлов с использованием той или иной формы локального хранилища. задержка, вызванная ошибкой R14, затем приводит к ошибке R10 (время ожидания загрузки).
решение:
в файле package.json измените начало на "start": "node --max-old-space-size=4096 server/index.js". это увеличивает размер хранилища.
также
установить эту переменную heroku heroku canfig:set NODE_ENV=dev