Heroku + node.jsエラー(Webプロセスは起動から60秒以内に$ PORTにバインドできませんでした)


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/');

何か案が ?


ここにコードを投稿できますか?httpサーバーを起動する場合は、できれば.listen()の部分
Benjamin

回答:


987

Herokuは動的にアプリにポートを割り当てるため、ポートを固定番号に設定することはできません。Herokuはenvにポートを追加するので、そこからプルできます。これを聞いてください:

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

そうすれば、ローカルでテストするときにポート5000をリッスンしますが、Herokuでも動作します。

ここでNode.jsのHerokuドキュメントを確認できます


96
重要なのは、process.env.portではなく、process.env.PORTを使用することです。
gprasant 2014

綺麗な!'websocket'モジュールで私のために働いた。
philx_x

1
時間を節約していただきありがとうございます。
allsoft 2016年

2
次に例を示します。github.com
Pablo

2
ありがとう、私のためにも働いた。私は、これはHerokuのドキュメントに明確になされていなかった驚いている
sidarcy

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 was
failed

31

コードでポートが指定されていない場合、それwebプロセスはなく、おそらくworker代わりにプロセスである。

したがって、Procfile(特定のコマンドを入力して)を読み取るように変更します。

worker: YOUR_COMMAND

そしてCLIでも実行します:

$ heroku scale worker=1


1
同じ問題がありましたが、「localhost」を「0.0.0.0」であるIPに置き換えることで問題を解決できました
Damith Asanka

2
HerokuでDiscordボットを実行していると、ループが発生しました。Slack、Hipchatなどのボットでも、同様の問題が発生する可能性があります。
スカイラー2017

1
この方法を使用する場合は、必ず[リソース]タブに移動し、Webプロセスをオフにして、ワーカープロセスをオンにしてください。そうすれば、Herokuはポートバインディングを期待しません。
Isaac Lyman

1
ああ、どうもありがとう。私はこれを調べようと頑張った。HercでProcfileの点でWebアプリケーションとワーカーアプリケーションが異なるとは思いませんでした。彼らが私にstartスクリプトを追加する必要があったことは言及する価値がありますpackage.json
Rishav

1
私の場合、procfileをwebからworkerに変更しました。動いた!!Thkns
rodrigorf

27

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

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
この回答はより完全なだけでなく、2つの考えられる問題を対象とした唯一の回答です。私の場合、ポート構成は正しいですが、リスニングアドレスではありません。これは受け入れられる答えになるはずです。
Danielo515 2018

私の場合、以下のように変更し てherokuで動作する const port = 3000;ようconst port = process.env.PORT || 3000;に動作します
vpgodara

実際に私のために働いた唯一のこと、ありがとう
イブラヒム・モハメッド

10

私の場合、私はhttps://hapijs.com/の例を使用していました

交換した問題を修正するには

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

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

process.env.PORT正しく指定して使用する場合は、hostparamのままにしてください。次のことはできません:)ここを参照:stackoverflow.com/a/34956330/626369
Dominick


2

私の場合、私はbabel-plugin-transform-inline-environment-variablesプラグインでBabelを使用していました。どうやら、Herokuはデプロイを実行するときにPORT環境変数を設定しないため、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はファイルを完全に無視します。
Vladimir Despotovic

0

同じ問題がありましたが、「localhost」を「0.0.0.0」であるIPに置き換えることで問題を解決できました


0

ポートには固定番号を設定できません。herokuはを使用して動的に割り当てますprocess.env.PORT。ただし、このように両方を追加できますprocess.env.PORT || 5000。Herokuは最初のものを使用し、ローカルホストは2番目のものを使用します。

コールバック関数を追加することもできます。以下のコードを見てください

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

0

すべての解決策で、期待どおりに1つの作業を試していません。デフォルトでherokuを調べます。.envファイルはPORTを維持する必要があります。process.env.PORTです。herokuはデフォルトでキーワードPORTを探します。

APP_PORT =などの名前変更をキャンセルし、代わりに環境ファイルでPORT =を使用します。


0

heroku bashプロセスから、yargsなどのオプションパーサーを使用して、$ PORTの値をノードアプリに渡します。

以下はその方法の例です。スクリプトオブジェクトのpackage.json内に、開始メソッド「node server --port $ PORT」を追加します。

サーバーファイルで、yargsを使用して、startメソッドのポートオプション(--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

私のように、package.jsonデプロイ時にファイルからスクリプトを実行するようにHerokuを構成している場合はPORT、そのスクリプトでの値をハードコーディングしていないことを確認してください。もしそうなら、あなたは私のようになって、このエラーが発生する理由を理解するために1時間費やすことになります。


0

私は同じ問題を抱えていましたが、エクスプレスとアポロサーバーで。ここからの解決策:

行う必要がある唯一の特別な考慮事項は、サーバーがデプロイされるポートをherokuが選択できるようにすることです。そうしないと、リクエストのタイムアウトなどのエラーが発生する可能性があります。

実行時にHerokuによって定義されたポートを使用するようにapollo-serverを構成するには、PORT環境変数によって定義されたポートを使用して、セットアップファイルのlisten関数を呼び出すことができます。

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

0

私の場合、2つの問題がありました...

1)別のエントリファイルからアプリを実行しているためリスナーがまったくなく、この実行スクリプトはpackage.json "scripts"から削除されました

ここに画像の説明を入力してください

2) 'sequelize'ではなく 'Sequelize'の大文字と小文字を区別する問題

ここに画像の説明を入力してください


0

私も同じ問題を抱えていました。最終的に、リクエストエンドポイントにポート番号が必要ないことに気付きました。(したがって、エンドポイントはhttps://...herokuapp.comであり、https://...herokuapp.com:5000ではありませんでした)。

listen()呼び出しは、ホストとコールバックなしで行うことができます:server.listen(5000);


デフォルトのポートを使用する場合は、URLにポート番号は必要ありません。では、どのようにして問題を解決するのでしょうか。
RalfFriedl

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を実行しました

どうやらそれが問題でした。2つを1つのファイルに結合すると、herokuアプリが期待どおりにデプロイされました。

私がこの問題に遭遇した人を見つけられなかったので、それが誰かを助けることを願っています


0

私はReactJsを使用していますが、herokuにアップロードする場合は、これをwebpack.config.jsに追加してください

追加しないとエラーになります

エラーR10(起動タイムアウト)-> Webプロセスは起動から60秒以内に$ PORTにバインドできませんでした

//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

クレジット:gprasant

この回答で問題が解決したので、これを再投稿したいと思います。私の問題は、herokuにデプロイするときに、ターミナルで「heroku logs --tail」を実行すると、「Webプロセスが起動から60秒以内に$ PORTにバインドできなかった」というエラーが発生することでした。しかし、サーバーをローカルで実行すると、アプリケーションは期待どおりに実行されます。

私はこれを私の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を使用してください!!!! ポート!=ポート!!! (明らかに)

クレジット:gprasant

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.