Heroku上的Node / Express应用程序:Web进程在启动后60秒内无法绑定到$ PORT

时间:2016-12-28 22:32:35

标签: node.js express heroku

我正在尝试在Heroku上运行我的Node.js应用程序(在localhost上运行完全正常),但遇到了一些问题。还有一些其他问题用同样的错误回答,但没有一个解决方案对我有用。以下是我从Heroku日志中获得的内容:

2016-12-28T22:06:45.705675+00:00 heroku[web.1]: Starting process with command `node app.js`
2016-12-28T22:06:48.358120+00:00 app[web.1]: Environment: HEROKU
2016-12-28T22:06:48.360021+00:00 app[web.1]: Listening on PORT:13812
2016-12-28T22:06:49.226997+00:00 app[web.1]: Application Loaded...
2016-12-28T22:07:45.958705+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2016-12-28T22:07:45.958927+00:00 heroku[web.1]: Stopping process with SIGKILL
2016-12-28T22:07:46.102423+00:00 heroku[web.1]: Process exited with status 137
2016-12-28T22:07:46.079295+00:00 heroku[web.1]: State changed from starting to crashed
2016-12-28T22:07:46.080349+00:00 heroku[web.1]: State changed from crashed to starting

冲洗并重复。这是我在应用程序启动后尝试导航到我的URL时得到的结果:

2016-12-28T22:16:57.209624+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=sc-library-test.herokuapp.com request_id=e98196c1-1545-4a49-9c20-f4ac7f2ab964 fwd="70.95.172.183" dyno= connect= service= status=503 bytes=

现在我的代码,特别是Express。附带的bin / www文件。

const config = require('../config');
/**
 * Get port from environment and store in Express.
 */
const port = normalizePort(config.port || '3000');
app.set('port', port);

/**
 * Get hostname from environment.
 */
const host = config.host || 'localhost';

/**
 * Create HTTP server.
 */

const server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port, host);

function normalizePort(val) {
  console.log("val: " + val);
  const port = parseInt(val, 10);
  console.log(port);
  if (isNaN(port)) {
    // named pipe
    console.log("nan");
    return val;
  }

  if (port >= 0) {
    // port number
    console.log(">=0");
    return port;
  }
  console.log("false");
  return false;
}

我尝试过使用和不使用主机的server.listen,但无论如何我都得到相同的错误。这是我的配置文件:

module.exports = {
  port: process.env.PORT,
  host: '0.0.0.0',
    base_url: process.env.BASE_URL,
    auth: {
    client_id: process.env.CLIENT_ID
  },
    neo4j_href : process.env.NEO4J_HREF,
  redis_url: process.env.REDIS_URL,
    redis_secret: process.env.REDIS_SECRET
}

正如您所看到的,我正在从heroku环境中拉出端口,以及其他环境变量,并在我的server.listen()上使用它。

其他一些信息......我目前没有使用Procfile。我的应用程序由一个Web服务器组成,由于我的应用程序使用单个web dyno运行,没有没有Procfile的工作程序,我认为这很好。如果我错了,请纠正我。

编辑:这是我更新的bin / www文件,它仍然给我同样的错误。

const app = require('../app');
const config = require('../config');

const port = config.port || '3000';
app.listen(port);

1 个答案:

答案 0 :(得分:0)

您的节点应用实际上并没有正确启动Web服务器。在我看来,您对server.listen的使用不正确(请参阅the docs here)。

虽然您可以随时重写server.listen来电以传递正确的对象 - 因为您使用的是Express,实际上这是一种更简单的方法。 Express支持使用标准库内容的方便包装来运行服务器。以下是如何重新编写代码以使用它的方法:

const config = require('../config');

const port = config.port || '3000';
app.listen(port);

这将启动服务器,将其绑定到0.0.0.0,并使其侦听所需的端口。

注意:您不再需要将端口解析为整数,因为这是由抽象层处理的。