由于硬编码的端口号,将node.js应用程序部署到heroku时遇到问题

时间:2014-07-01 05:32:35

标签: node.js heroku

我无法将角度种子应用程序(https://github.com/angular/angular-seed)部署到Heroku。我相信问题是当heroku需要通过process.env.PORT变量动态分配端口时,端口号被硬编码到服务器启动脚本中。查看heroku日志确认:Starting up http-server, serving ./ on port: 8000。我的Procfile包含web: npm start,我的package.json文件包含

"scripts": {
  "prestart": "npm install",
  "start": "http-server -a localhost -p 8000"
}

如何更改它以便我的服务器仍能在foreman start的本地开发环境中正常运行,但是在使用heroku时动态分配端口?我想要它,以便当我在本地开发环境中键入foreman start时,将在localhost:8000创建一个服务器,但是当我将应用程序部署到heroku时,Heroku将选择该端口。

3 个答案:

答案 0 :(得分:5)

我不是Node开发人员,但为什么不在start脚本中使用Heroku配置的PORT编号?

即。 "start": "http-server -a localhost -p $PORT"

然后它将在Heroku上运行。如果您在本地运行,只需export PORT=8000,或者PORT=8000如果您使用.env运行foreman,那么您就可以了。

如果通过将$PORT替换为${PORT-8000}来设置PORT,您也可以添加bash magic来设置PORT。

(未测试的)

答案 1 :(得分:3)

遇到同样的问题。到目前为止,在快递的帮助下解决了它。

  1. 添加了Procfile:

    web: node web.js
    
  2. 添加了web.js

    var port = Number(process.env.PORT || 8000);
    
    var express = require('express');
    var app = express();
    
    app.use(express.static(__dirname + '/app'));
    var server = app.listen(port, function() {
        console.log('Listening on port %d', server.address().port);
    });
    
  3. 在package.json

  4. 的依赖项部分添加了"express": "3.x"
  5. 替换

    "start": "http-server -a localhost -p 8000"
    

    "start": "node web.js"
    
  6. 然后提交,运行git push heroku master,然后完成heroku open

答案 2 :(得分:2)

如果您希望在没有明确的情况下解决问题,只使用节点http-server模块,请在package.json中找到您需要的内容:

{
  "dependencies": {
    "http-server": "*"
  },
  "scripts": {
    "start": "http-server ./ -p ${PORT:=5000} -c-1"
  }
}

<强>解释

  • 在您的依赖项中添加http-server(不应该在dev依赖项中)
  • -p ${PORT:=8000}将服务器绑定到可用于heroku实例的端口,该端口可在环境变量中找到。如果该名称不存在environement变量(例如,本地),则默认为8000
  • 删除了与heroku不兼容的-a localhost