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.PORT
dynamic分配它。 但是你可以添加它们,就像这个process.env.PORT || 5000
process.env.PORT || 5000
。 Heroku将使用第一个,而你的本地主机将使用第二个。
你甚至可以添加你的回叫function。 看下面的代码
app.listen(process.env.PORT || 5000, function() { console.log("Server started......."); });