2017-05-23 7 views
0

かなり単純なnode.jsエクスプレスアプリをヒーローにプッシュして動作させることができません。それは突然クラッシュする。​​は私を与える:期待通りに実行Node.jsエクスプレスアプリがヒーローでクラッシュする

web : node server.js 
worker: node workers/match.js 

労働者を、:

2017-05-23T04:43:08.156660+00:00 app[api]: Scaled to [email protected]:Free [email protected]:Free by user [email protected] 
2017-05-23T04:43:24.388293+00:00 heroku[web.1]: Starting process with command `: node server.js` 
2017-05-23T04:43:26.207926+00:00 heroku[web.1]: Process exited with status 0 
2017-05-23T04:43:26.220393+00:00 heroku[web.1]: State changed from starting to crashed 
2017-05-23T04:43:26.221461+00:00 heroku[web.1]: State changed from crashed to starting 
2017-05-23T04:43:43.343050+00:00 heroku[web.1]: Starting process with command `: node server.js` 
2017-05-23T04:43:44.751608+00:00 heroku[web.1]: Process exited with status 0 
2017-05-23T04:43:44.762870+00:00 heroku[web.1]: State changed from starting to crashed 
2017-05-23T04:43:46.400260+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=yetie.herokuapp.com request_id=d7913d1e-64ab-497b-a59d-fda9454d6e69 fwd="81.56.46.53" dyno= connect= service= status=503 bytes= protocol=https 
2017-05-23T04:43:46.899099+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=yetie.herokuapp.com request_id=1fdc61fb-eebe-40a2-8b0a-a71b09f7ff10 fwd="81.56.46.53" dyno= connect= service= status=503 bytes= protocol=https 

私は含まれていProcfileを持っています。 server.jsは次のようになります。

const express = require('express'); 
const app = express(); 

app.use(express.static(__dirname + '/testheroku')); 

app.listen(process.env.PORT || 8080, function(){ 
    console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env); 
}); 

で/ testheroku DIRシングル "Hello World" のhtmlファイルがあります。

私はheroku local webとローカルで実行すると、私はnode server.js、その後heroku run bashでHerokuのダイナモに接続してそれを実行し、それが適切に「Hello World」のhtmlファイルを取得wget http://localhost:xxxxを行う場合には、動作します。

しかし、私がアプリケーションをビルドするときに英雄が私に与えるURLにアクセスしようとすると、私は上記のクラッシュログを取得します。要求された場合、私はpackage.jsonファイルを含むことが

node --version => v6.10.3 
npm --version => 3.10.10 

が、それは(より複雑なangular2アプリに基づいて)かなり長いですし、それがコンパイルされます。

ノードとNPMのバージョンでは、ローカルおよびHerokuの上で同じです適切にロカイとヒロクの両方。そして、私がnode server.jsをdyno thru bashに接続して実行すると、問題はそこにあるはずです。

stackoveflowまたはelswereで見つかったほとんどの回答はポートの問題を示唆し、私がしたapp.listen(process.env.PORT || 8080)のトリックを使用することを提案しています。では、私はここで何が欠けていますか?

答えて

2

npm startで実際にアプリを起動できることと、それが終了しないことを確認してください。これはHerokuのようです。

ログからは、イベントリスナーがなくなったためにプロセスが正常に終了した場合、通常は状況0の開始から約2秒後にアプリが終了するように見えますが、他の問題、特に例外が自動的にキャッチされ、適切なコンテキストが表示されない場合

また、お使いのアプリがpackage.jsonに含まれていないグローバルにインストールされた依存関係に依存していないことを確認してください。 Herokuが必要とされるすべてのインストールとビルド手順を実行していることを確認します。コードを新しいディレクトリにコピーしてnpm install && npm startで実行できることを確認してください。

私はこの変更になります。それが原因でアクセスしたい変数のすべてのクラッシュいないことを確認する

const port = process.env.PORT || 8080; 
app.listen(port,() => { 
    console.log('Express server listening on port', port) 
}); 

:これまで

app.listen(process.env.PORT || 8080, function(){ 
    console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env); 
}); 

を。

それはまだGitHubの上で私のデモを見て動作しない場合:

またexpress.staticを使用し、Herokuの上で動作することが知られている - にデプロイしてHerokuのボタン:

Deploy to Heroku

より厳しい要件のトンを持っています通常のHerokuアプリ。

そのプロジェクトのpackage.json、server.js、およびapp.jsonを見てください。

'use strict'; 

const path = require('path'); 
const express = require('express'); 
const http = require('http'); 

const app = express(); 
const server = http.Server(app); 

const port = process.env.PORT || 8080; 

app.use('/', express.static(path.join(__dirname, 'testheroku'))); 

server.listen(port,() => { 
    console.log(`Listening on http://localhost:${port}/`); 
}); 

または直接httpモジュールの使用なし:

あなたは、最小限のserver.jsファイル持つことができるはずです

'use strict'; 

const path = require('path'); 
const app = require('express')(); 

const port = process.env.PORT || 8080; 

app.use('/', express.static(path.join(__dirname, 'testheroku'))); 

app.listen(port,() => { 
    console.log(`Listening on http://localhost:${port}/`); 
}); 

をそれはあなたのpackage.jsonは、A含んでいることも重要です開始スクリプト:

"scripts": { 
    "start": "node server.js" 
    }, 
+0

これは機能しています。 Procfileは、package.jsonの開始スクリプトよりも優先されます。 Procfileから 'web:node server.js'という行を削除しました。労働者に任せてください。 Herokuはまだ2つのプロセスタイプを検出します。 1つの 'web:npm start'と1つの' worker:node workers/match.js'そして、npm startがProcfileからの削除された行とまったく同じことを行っても動作します。私のserver.jsファイルをそのまま残しました。 –

0

別の方法でこれを行うことができます:

app.set("port", process.env.PORT || 3000); 
app.set("host", process.env.HOST || "localhost"); 

app.listen(app.get("port"), function() { 
    console.log(
    "%s server listening at http://%s:%s", 
    process.env.NODE_ENV, 
    app.get("host"), 
    app.get("port") 
); 
}); 
関連する問題