我有我的第一个node.js应用程序(在本地运行良好)-但是我无法通过heroku部署它(也是第一次使用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/');


任何想法?

评论

您可以在这里发布您的代码吗?如果要启动http服务器,最好是.listen()部分。

#1 楼

Heroku动态为您的应用分配一个端口,因此您不能将端口设置为固定编号。 Heroku将端口添加到环境中,因此您可以从那里拉出它。切换到以下位置:

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


这样,当您在本地测试时,它仍将监听端口5000,但它也可在Heroku上运行。

您可以在此处查看Node.js上的Heroku文档。

评论


重要的是您使用process.env.PORT而不是process.env.port。

– gprasant
2014-02-25 14:15

美丽!通过“ websocket”模块为我工作。

– philx_x
15年5月18日在21:10

这是一个示例:github.com/heroku/node-js-getting-started/blob/master/index.js

–巴勃罗
16年4月28日在11:39

谢谢,也为我工作。我很惊讶在Heroku文档中没有更清楚地说明这一点

–锡达西
16年7月23日在8:18

@redhotvengeance谢谢..提到它的大小写并节省了一天的时间:)

–马亨德兰
16 Sep 8'在17:14

#2 楼

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


评论


通过以下调用:app.listen(serverPort,“ localhost”,function(err){Heroku失败。将“ localhost”切换为“ 0.0.0.0”很有帮助。谢谢!

– pubsy
17年8月29日在21:02



#3 楼

值得一提的是,如果您的代码未指定端口,则它不应是web进程,而应该是worker进程。

因此,请将Procfile更改为(填写特定命令):

worker: YOUR_COMMAND


,然后在CLI上运行:

heroku scale worker=1


评论


我遇到了同样的问题,可以解决将“ localhost”替换为IP“ 0.0.0.0”的问题

–Damith Asanka
17年7月16日在18:54

我在Heroku上运行Discord机器人,这使我陷入循环。 Slack,Hipchat等机器人可能会遇到类似的问题。

– Skylar
17年8月29日在4:12

如果采用这种方式,请确保转到“资源”选项卡,关闭Web进程并打开辅助进程。这样Heroku就不会期望端口绑定。

–艾萨克·莱曼(Isaac Lyman)
18-09-28在16:29

哦,非常感谢你。我发疯了试图查找这个。我不知道在Procfile方面,Heroku中的Web和worker应用程序有所不同。值得一提的是,他们需要我在package.json中添加启动脚本

–里沙夫
19 Mar 6 '19 at 16:19

就我而言,我将procfile从Web更改为worker。有效!! Thkns

– Rodrigorf
19年11月13日在15:26

#4 楼

对于同时通过端口和主机的端口,请记住,Heroku不会绑定到localhost

您必须将0.0.0.0传递给主机。

即使重新使用正确的端口。我们必须进行以下调整:

# port (as described above) and host are both wrong
const host = 'localhost';
const port = 3000;

# use alternate localhost and the port Heroku assigns to $PORT
const host = '0.0.0.0';
const port = process.env.PORT || 3000;


然后,您可以像往常一样启动服务器:

app.listen(port, host, function() {
  console.log("Server started.......");
});


您可以在此处查看更多详细信息:https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

评论


这个答案不仅更完整,而且是针对两个可能问题的唯一答案。在我的情况下,端口配置正确,但侦听地址不正确。这应该是公认的答案。

–Danielo515
18年2月12日在6:11

在我的情况下,它按如下const port = 3000的方式工作;到const port = process.env.PORT || 3000;它在heroku上工作

–vpgodara
19年1月6日在4:42



天哪,我不敢相信文档中的任何地方都没有提到这。我什至试图让Heroku通过他们自己的process.env.HOST,但是效果不佳。最初,我将其设置为localhost,以为Heroku设置了某种反向代理。不仅没有记录在案,而且答案必须是Stackoverflow上的第四个答案。有时我想知道为什么我选择这种职业道路:(

–迷人的机器人
7月23日20:12

#5 楼

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

我替换了此代码

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


评论


这对我有用!您能解释一下为什么行得通吗?

–斯里拉姆·凯拉萨姆(Sriram Kailasam)
7月25日6:29

#6 楼

就我而言,我正在使用https://hapijs.com/

中的示例来解决我替换为

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


的问题,将

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


评论


对于使用正确指定process.env.PORT的用户,但留在主机参数中:您不能:)参见此处:stackoverflow.com/a/34956330/626369

–多米尼克
17年5月27日在2:55

#7 楼

更改此行
app.listen(port);
app.listen(process.env.PORT, '0.0.0.0');

它将起作用

#8 楼

将我的侦听端口从3000更改为(process.env.PORT || 5000)可以解决此问题。

#9 楼

就我而言,我将Babel与babel-plugin-transform-inline-environment-variables插件一起使用。显然,Heroku在进行部署时未设置PORT env变量,因此process.env.PORT将被undefined替换,并且您的代码将回退到Heroku不了解的开发端口。

#10 楼

我意识到我不需要请求端点中的端口号,因此端点是herokuapp.com而不是herokuapp.com:5000

listen()调用可以不带主机和回调:

server.listen(5000);


评论


如果使用默认端口,则不需要URL中的端口号。那如何解决问题呢?

– RalfFriedl
19-10-7在18:33

#11 楼

编辑package.json

...
"engines": {
"node": "5.0.0",
"npm": "4.6.1"
},
...


Server.js

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...


评论


就我而言,我取出了package.json的那部分。我相信对其进行更新也可以解决此问题。

–马克
18年1月17日在19:06

#12 楼

我使用ReactJs,
如果要上传到heroku,请在webpack.config.js中添加它。
因为不添加,则会出现错误

错误R10(引导超时)- > Web进程在启动后60秒内未能绑定到$ PORT

//webpack.config.js add code like that

const HtmlWebPackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
var server_port = process.env.YOUR_PORT || process.env.PORT || 5000;
var server_host = process.env.YOUR_HOST || "0.0.0.0";

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"]
      }
    ]
  },
  devServer: {
    disableHostCheck: true,
    contentBase: "./ dist",
    compress: true,
    inline: true,
    port: server_port,
    host: server_host

  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "index.html"
    }),
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css"
    })
  ]
};


#13 楼

我遇到了同样的问题,因为我没有定义Procfile。将没有文件扩展名的文本文件提交到应用程序的根目录,名为Procfile。此文件告诉Heroku运行哪个命令来启动您的应用。
web: node app.js


评论


谢谢,我忘了这么做。没有此文件,heroku将完全忽略文件。

–弗拉基米尔·德斯波托维奇(Vladimir Despotovic)
5月21日14:25

#14 楼

我遇到了同样的问题,可以解决将IP地址替换为“ 0.0.0.0”的“ localhost”的问题。

#15 楼

无法为端口设置固定编号,heroku使用process.env.PORT动态分配它。但是您可以将它们都添加,例如process.env.PORT || 5000。 Heroku将使用第一个,而您的localhost将使用第二个。

您甚至可以添加回调函数。查看下面的代码

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


#16 楼

在所有解决方案中,我没有按预期尝试过任何工作,默认情况下,我研究heroku。.env文件应保持约定PORT,process.env.PORT,heroku缺省情况下将查找关键字PORT。

取消任何重命名,例如APP_PORT =,而在环境文件中使用PORT =。

#17 楼

在heroku bash流程中,使用诸如yargs之类的选项解析器将$ PORT的值传递给您的节点应用程序。

以下是您可能如何执行此操作的示例。在package.json文件内的脚本对象上,添加启动方法“ node server --port $ PORT”。

在服务器文件中,使用yargs从port选项中获取值(-端口$ PORT)的启动方法:

const argv = require('yargs').argv;
const app = require('express')();

const port = argv.port || 8081;

app.listen(argv.port, ()=>{
    console.log('Probably listening to heroku $PORT now ', argv.port); // unless $PORT is undefined, in which case you're listening to 8081.
});


现在,当您的应用程序启动时,它将绑定到$ PORT的动态设置值。

#18 楼

如果像我一样,在将Heroku配置为在部署时从package.json文件运行脚本,请确保未在该脚本中硬编码PORT的值!如果这样做,您最终会像我一样,花一个小时试图弄清楚为什么会出现此错误。

#19 楼

我有同样的问题,但快递和阿波罗服务器。来自此处的解决方案:


唯一需要考虑的特殊事项是允许
heroku选择服务器部署到的端口。否则,
可能会出现错误,例如请求超时。

要将apollo-server配置为在运行时使用Heroku定义的端口,
设置中的listen函数可以使用由PORT环境变量定义的端口
调用文件:


> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });


#20 楼

就我而言,我有两个问题...

1)根本没有侦听器,因为正在从另一个条目文件运行应用程序,并且此运行脚本已从package.json“ scripts”中删除



2)用'Sequelize'而不是'sequelize'区分大小写的问题



#21 楼

就我而言,端口和主机都不是问题。 index.js分为2个文件。 server.js

 //server.js
const express = require('express')
const path = require('path')

const app = express()

app.use(express.static(path.resolve(__dirname, 'public')));
// and all the other stuff
module.exports = app

//app.js
const app = require('./server');
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0', () => {
    console.log('Server is running s on port: ' + port)
});
 


package.json开始,我们运行了node app.js

显然那是问题所在。将两者合并为一个文件后,Heroku应用程序将按预期部署。

#22 楼

我的问题是,部署到heroku时出现错误:


Web进程在启动后60秒内未能绑定到$ PORT


在终端中运行heroku logs --tail时。但是当我在本地运行服务器时,该应用程序将按预期运行。

我在index.js文件(服务器文件)中保存了该文件。

const PORT = process.env.port || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})


但是应该有这个

const PORT = process.env.PORT || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})


使用process.env.PORT而不是process.env.port,因为portPORT显然不同。

请相信。

#23 楼

即使我来晚了,但是这可能会在将来的日子里帮助那些陷入困境的人。
我遇到了同样的问题,但是我的问题是使用npm start运行许多命令。
我正在运行create表格,并在启动应用程序之前插入数据,并在运行前超过10秒。所以我删除了那些命令,问题就解决了。
谢谢

#24 楼

我有同样的问题,但是我的环境变量设置正确,并且在package.json中指定了npm和node的版本。我发现这是因为,就我而言,Heroku需要在package.json中指定“开始”:
  "scripts": {
    "start": "node index.js"
  }

将其添加到package.json后,我的节点应用程序已成功部署在Heroku上。