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


443

我有我的第一个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()部分
Benjamin Gruenbaum 2013年

Answers:


980

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

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

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

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


95
重要的是您使用process.env.PORT而不是process.env.port。
gprasant 2014年

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

1
感谢您节省时间。
allsoft '16


2
谢谢,也为我工作。我感到惊讶的是,在Heroku文档中没有更清楚地说明这一点
sidarcy '16

34

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

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

31

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

因此,将您Procfile的内容更改为“ read”(填写您的特定命令):

worker: YOUR_COMMAND

然后还可以在CLI上运行:

$ heroku scale worker=1


1
我遇到了同样的问题,可以通过将IP地址替换为“ 0.0.0.0”来替换“本地主机”的问题
Damith Asanka

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

1
如果采用这种方式,请确保转到“资源”选项卡,关闭Web进程并打开工作进程。这样Heroku就不会期望端口绑定。
艾萨克·莱曼

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

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

27

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

25

对于同时通过端口和主机的服务器,请记住,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


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

在我的情况下,它的工作原理如下所示 const port = 3000;const port = process.env.PORT || 3000; 它在heroku上起作用
vpgodara

唯一对我
Ibrahim Mohammed


2

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



1

以下步骤解决了我的解决方案:

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。我相信对其进行更新也可以解决此问题。
马克

1

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


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


0

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

您甚至可以添加回叫功能。看下面的代码

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

0

在所有解决方案中,我没有按预期尝试过任何工作,我默认情况下研究heroku。

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


0

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

这是您可能如何执行此操作的示例。在scripts对象的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的动态设置值。


0

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


0

我遇到了同样的问题,但是使用了express和apollo服务器。来自这里的解决方案:

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

要将apollo服务器配置为在运行时使用Heroku定义的端口,可以使用PORT环境变量定义的端口调用安装文件中的listen函数:

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

0

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

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

在此处输入图片说明

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

在此处输入图片说明



0

就我而言,端口和主机都不是问题。我们的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运行了节点app.js

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

希望对我有所帮助,因为我发现没有人遇到此问题


0

我使用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
 })
 ]
};

0

归功于:gprasant

我只想重新发布此内容,因为此答案解决了我的问题。我的问题是,在终端中运行“ heroku logs --tail”时,部署到heroku时出现错误“ Web进程未能在启动后60秒内绑定到$ PORT”。但是当我在本地运行服务器时,应用程序将按预期运行。

我在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 !!!! 端口!=端口!!! (明显)

归功于:gprasant

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.