Heroku + node.js错误(Web进程无法在启动后的60秒内绑定到$ PORT)

我有我的第一个node.js应用程序(本地运行良好) – 但我无法通过heroku(第一次w / heroku以及)部署它。 代码如下。 所以我不会让我写这么多的代码,所以我只是说在本地运行代码以及在我的networking中显示没有问题。

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

任何想法 ?

Herokudynamic地为你的应用程序分配一个端口,所以你不能将端口设置为一个固定的数字。 Heroku把端口添加到env,所以你可以从那里拉它。 切换你的听:

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

这样当你在本地testing的时候它仍然会听5000端口,但是它也能在Heroku上运行。

你可以在这里查看Node.js上的Heroku文档。

在使用yeoman的angular-fullstack生成的项目并删除为我工作的IP参数时,我遇到了同样的问题。

我replace了这个代码

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

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

就我而言,我使用https://hapijs.com/中的示例;

解决我replace的问题

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

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

值得一提的是,如果你的代码没有指定端口,那么它不应该是一个web进程,而应该是一个worker进程。

所以,改变你的Procfile来读取(填写你的特定命令):

worker YOUR_COMMAND

然后在CLI上运行:

$ heroku scale worker=1

在我的例子中,我使用了Babel和babel-plugin-transform-inline-environment-variables插件。 显然,Heroku在部署时没有设置PORT envvariables,所以process.env.PORT会被undefined取代,你的代码会回退到Heroku不知道的开发端口。

我有同样的问题,我可以解决问题replace'本地主机'IP为'0.0.0.0'

不能为端口设置固定的号码,heroku使用process.env.PORTdynamic分配它。 但是你可以添加它们,就像这个process.env.PORT || 5000 process.env.PORT || 5000 。 Heroku将使用第一个,而你的本地主机将使用第二个。

你甚至可以添加你的回叫function。 看下面的代码

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