Node.js表达app继续在heroku上崩溃

时间:2017-05-23 13:45:53

标签: node.js express heroku

我在heroku上推了一个相当简单的node.js表达应用程序并且无法使其正常工作。它无意中崩溃了。 heroku tail --logs给了我:

2017-05-23T04:43:08.156660+00:00 app[api]: Scaled to web@1:Free worker@0:Free by user jp@yetie.fr
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:

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

worker,按预期运行。 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在本地运行时,它可以运行,当我通过heroku run bash然后node server.js连接到heroku dyno然后执行wget http://localhost:xxxx正确运行它“hello world”html文件。

但是当我尝试访问构建应用程序时heroku给我的url时,我得到了上面的崩溃日志。

Node和npm版本在本地和heroku上是相同的:

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

如果需要,我可以包含package.json文件,但它相当长(基于更复杂的angular2应用程序)并且它可以正确编译localy和heroku。当我设法通过连接到dyno thru bash来运行node server.js时,我怀疑问题应该在那里。

我在stackoveflow或elswere上找到的大多数答案都提出了一个端口问题并使用app.listen(process.env.PORT || 8080)技巧,我做了。那我在这里错过了什么?

2 个答案:

答案 0 :(得分:3)

确保您可以使用npm start实际启动您的应用,并且它不会退出,就像在Heroku上一样。

从日志中看,您的应用程序似乎在从状态0开始大约2秒后退出,如果进程正常退出通常就是这种情况,因为没有更多的事件监听器,但有时它可能是由其他问题引起的,尤其是当您的例外被自动捕获并且您没有看到正确的背景时。

还要确保您的应用程序不依赖于package.json中未包含的任何全局安装的依赖项。确保Heroku完成所需的所有安装和构建步骤。确保您可以将代码复制到新目录中并使用npm install && npm start运行它。

我会改变这个:

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

到此:

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

确保它不会因为您要访问的所有变量而崩溃。

如果仍然无法工作,请查看我在GitHub上的演示:

它还使用express.static并且已知可以在Heroku上工作 - 部署到Heroku按钮:

Deploy to Heroku

比普通的Heroku应用程序有更严格的要求。

看一下该项目中的package.json,server.js和app.json。

您应该能够拥有最小的server.js文件:

'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模块用法:

'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包含一个启动脚本也很重要:

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

答案 1 :(得分: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")
  );
});