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

use*_*900 408 heroku node.js

我有我的第一个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/');
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?

red*_*nce 913

Heroku动态地为您的应用分配一个端口,因此您无法将端口设置为固定数字.Heroku将端口添加到env中,因此您可以从那里拉出它.切换你的听:

__CODE__

这样,当你在本地测试时它仍然会听到端口5000,但它也可以在Heroku上运行.

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

  • 重要的是你使用process.env.PORT而不是process.env.port. (88认同)
  • 您还需要确保主机设置为“0.0.0.0” (5认同)
  • 请确保您有“process.env.PORT ||” 5000` 而不是 `5000 || 进程.env.PORT`。花了很长时间才意识到我的愚蠢错误...... (3认同)
  • 这是一个例子:https://github.com/heroku/node-js-getting-started/blob/master/index.js (2认同)
  • 谢谢,也为我工作.我很惊讶这在Heroku文档中并没有更明确 (2认同)

小智 27

当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);
});
Run Code Online (Sandbox Code Playgroud)

  • 随后调用:app.listen(serverPort,"localhost",函数(错误){Heroku失败.将"localhost"切换为"0.0.0.0"帮助.谢谢! (5认同)

vin*_*esh 26

在使用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'));
});
Run Code Online (Sandbox Code Playgroud)

server.listen(config.port, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
Run Code Online (Sandbox Code Playgroud)


zth*_*.nc 24

值得一提的是,如果你的代码不指定端口,那么它不应该是一个web过程,可能应该是一个worker过程,而不是.

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

worker: YOUR_COMMAND

然后还在CLI上运行:

$ heroku scale worker=1

  • 如果您选择此路线,请确保转到“资源”选项卡,关闭 Web 进程并打开工作进程。这样 Heroku 就不会期望端口绑定。 (3认同)
  • 就我而言,我将 procfile 从 web 更改为worker。有效!!思克恩斯 (3认同)
  • 我遇到了同样的问题,我可以通过将“localhost”替换为“0.0.0.0”的 IP 来解决问题 (2认同)
  • 我正在Heroku上运行一个Discord bot,这让我陷入了困境.Slack,Hipchat等机器人可能会有类似的问题. (2认同)

gre*_*egb 21

对于那些同时通过端口和主机的人,请记住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;
Run Code Online (Sandbox Code Playgroud)

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

app.listen(port, host, function() {
  console.log("Server started.......");
});
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案不仅更完整,而且是针对两个可能问题的唯一答案.在我的情况下,端口配置是正确的,但不是监听地址.这应该是公认的答案. (3认同)
  • 天哪,我不敢相信文档中的任何地方都没有提到这是怎么回事。我什至尝试让 Heroku 传递他们自己的“process.env.HOST”,但这也不起作用。起初,我将其设置为 localhost,认为 Heroku 设置了某种反向代理。这不仅没有记录,而且答案必须是 Stackoverflow 上的第四个。有时我想知道为什么我选择了这条职业道路:( (2认同)

nex*_*zzz 9

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

解决我替换的问题

server.connection({ 
    host: 'localhost', 
    port: 8000 
});
Run Code Online (Sandbox Code Playgroud)

server.connection({
    port: process.env.PORT || 3000 
});
Run Code Online (Sandbox Code Playgroud)


小智 7

改变这一行

app.listen(port);
Run Code Online (Sandbox Code Playgroud)

app.listen(process.env.PORT, '0.0.0.0');
Run Code Online (Sandbox Code Playgroud)

它会工作


Gio*_*gos 6

虽然这里的大多数答案都是有效的,但对我来说问题是我正在运行很长的进程作为其中的一部分npm run start导致超时。

我在这里找到了解决方案并对其进行了总结,我只需要转到npm run build一项postinstall任务即可。

换句话说,我改变了这个:

"start": "npm run build && node server.js"
Run Code Online (Sandbox Code Playgroud)

对此:

"postinstall": "npm run build",
"start": "node server.js"
Run Code Online (Sandbox Code Playgroud)

想想看,这是完全有道理的,因为随着我的应用程序不断增长,这个错误(曾经偶尔出现)变得越来越普遍。


小智 5

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


Awa*_*sir 5

重新启动heroku中的所有dynos对我来说很有效

在此输入图像描述