我正在尝试在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);
答案 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
,并使其侦听所需的端口。
注意:您不再需要将端口解析为整数,因为这是由抽象层处理的。