我有我的第一个node.js应用程序(在本地运行正常) - 但我无法通过heroku(第一次w / heroku)部署它 . 代码如下 . 所以我不会写这么多代码,所以我只想说在我的网络中本地运行代码没有问题 .
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/');
任何的想法 ?
16 回答
在所有的解决方案中,我没有按预期工作,我默认研究heroku .env文件应该维护约定PORT,process.env.PORT,heroku默认会查找关键字PORT .
取消任何重命名,例如APP_PORT =而不是在你的env文件中使用PORT = .
它's worth mentioning that if your code doesn' t指定一个端口,那么它不应该是
web
进程,而应该是worker
进程 .因此,将
Procfile
更改为读取(填写您的特定命令):worker: YOUR_COMMAND
然后还在CLI上运行:
$ heroku scale worker=1
当Heroku failed to bind the port or hostname 在
server.listen(port, [host], [backlog], [callback])
时发生错误 .Heroku需要的是
.listen(process.env.PORT)
或.listen(process.env.PORT, '0.0.0.0')
更一般地说,为了支持其他环境,请使用:
就我而言,我使用Babel和 babel-plugin-transform-inline-environment-variables 插件 . 显然,Heroku在进行部署时没有设置PORT env变量,因此
process.env.PORT
将被undefined
替换,并且您的代码将回退到Heroku不知道的开发端口 .在heroku bash过程中,使用yargs等选项解析器将$ PORT的值传递给您的节点应用程序 .
这是一个如何做到这一点的例子 . 在脚本对象上,在package.json中,添加一个start方法“node server --port $ PORT” .
在服务器文件中,使用yargs从start方法的port选项(--port $ PORT)获取值:
现在,当您的应用程序启动时,它将绑定到$ PORT的动态设置值 .
我有同样的问题,因为我没有定义Procfile . 将文本文件提交到应用程序的根目录,该目录名为Procfile,没有文件扩展名 . 此文件告诉Heroku运行哪些命令来启动您的应用程序 .
web: node app.js
对于那些通过端口和主机的人,请记住Heroku will not bind to
localhost
.You must pass
0.0.0.0
对于主持人 .即使您使用的是正确的端口 . 我们不得不进行这种调整:
然后你可以像往常一样启动服务器:
您可以在此处查看更多详细信息:https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error
如果像我一样,您正在配置Heroku以在部署时从
package.json
文件运行脚本,请确保您没有在该脚本中对PORT
的值进行硬编码!如果您这样做,则'll end up like me and spend an hour trying to figure out why you'收到此错误 .我有同样的问题,但有快递和apollo服务器 . 来自here的解决方案:
就我而言,我正在使用https://hapijs.com/中的示例
解决我替换的问题
同
我遇到了同样的问题,将我的监听端口从3000改为(process.env.PORT || 5000)解决了问题!
The below steps resolved my solution:
编辑 package.json 为:
和 Server.js :
Heroku动态地为您的应用分配一个端口,因此您无法将端口设置为固定数字 . Heroku将端口添加到env,因此您可以从那里拉出它 . 切换你的听:
.listen(process.env.PORT || 5000)
这样,当你在本地测试时它仍会听取端口5000,但它也适用于Heroku .
您可以在Node.js here上查看Heroku文档 .
在使用yeoman的angular-fullstack生成的项目并删除为我工作的IP参数时,我遇到了同样的问题 .
我替换了这段代码
同
无法为端口设置固定数量,heroku使用
process.env.PORT
动态分配 . 但是你可以添加它们,比如process.env.PORT || 5000
. Heroku将使用第一个,而您的localhost将使用第二个 .您甚至可以添加回调功能 . 看下面的代码
我有同样的问题,我可以解决问题,用IP替换'localhost'是'0.0.0.0'