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

node.js Node.js

乐米亚

2020-03-17

我有我的第一个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/');

任何想法 ?

第1913篇《Heroku + node.js错误(Web进程在启动后60秒内未能绑定到$ PORT)》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

15个回答
乐十三 2020.03.17

归功于: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

Harry 2020.03.17

我使用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”
 })
 ]
};
阳光梅L 2020.03.17

我有同样的问题。最终,我意识到我不需要请求端点中的端口号。(因此端点是https://...herokuapp.com而不是https://...herokuapp.com:5000)。

listen()调用可以不包含主机和回调:server.listen(5000);

神奇小宇宙 2020.03.17

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

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

在此处输入图片说明

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

在此处输入图片说明

凯十三 2020.03.17

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

老丝小小 2020.03.17

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

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

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

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

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

村村飞云 2020.03.17

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

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

MandyTony 2020.03.17

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

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

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

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

路易斯丁LEY 2020.03.17

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

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");
});
...
Itachi猿 2020.03.17

我遇到了同样的问题,将侦听端口从3000更改为(process.env.PORT || 5000)解决了该问题!

卡卡西Davaid 2020.03.17

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

JinJinDavaid 2020.03.17

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

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

worker: YOUR_COMMAND

然后还可以在CLI上运行:

$ heroku scale worker=1

蛋蛋伽罗猿 2020.03.17

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

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

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

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

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android