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

时间:2013-03-28 22:20:40

标签: node.js heroku

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

有什么想法吗?

31 个答案:

答案 0 :(得分:836)

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

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

这样,当你在本地进行测试时它仍然会听取端口5000,但它也适用于Heroku。

您可以在Node.js here上查看Heroku文档。

答案 1 :(得分:25)

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

答案 2 :(得分:24)

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

答案 3 :(得分:19)

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

因此,将Procfile改为阅读(填写您的特定命令):

worker: YOUR_COMMAND

然后也在CLI上运行:

$ heroku scale worker=1

答案 4 :(得分:16)

对于同时通过端口和主机的用户,请注意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

答案 5 :(得分:8)

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

中的示例

要解决问题我已更换

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

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

答案 6 :(得分:5)

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

我找到了解决方案 here,总结一下,我只需要将 npm run build 移至 postinstall 任务。

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

"start": "npm run build && node server.js"

为此:

"postinstall": "npm run build",
"start": "node server.js"

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

答案 7 :(得分:4)

更改此行

<div class="hero-container-2">
  <span id="contactus"></span>
  <p><span id="contactus">Itching to ask us a question about the club? Want to pick our brains about training, competing or joining? (We usually react quickly, but it might take us a handful of days to reply).</span></p>

  <div class="buttom">
    <span id="contactus">Contact Us</span>
  </div>
</div>

app.listen(port);

它将起作用

答案 8 :(得分:3)

重新启动 heroku 中的所有 dynos 对我有用

enter image description here

答案 9 :(得分:2)

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

答案 10 :(得分:2)

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

答案 11 :(得分: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");
});
...

答案 12 :(得分:1)

在我尝试过的所有解决方案中没有按预期工作,我默认研究heroku .env文件应该维护约定PORT,process.env.PORT,heroku默认会查找关键字PORT。

取消任何重命名,例如APP_PORT =而不是在你的env文件中使用PORT =。

答案 13 :(得分:1)

使用 process.env.PORT || 3000 作为您的端口。

这将在可用时使用 Heroku 的端口,如果不可用则使用端口 3000(例如,本地测试)

您可以将 3000 更改为您想要的任何值,例如 8080

答案 14 :(得分:1)

在开发应用程序时,我们需要按以下方式定义端口:

const port = process.env.PORT || 4000; // PORT must be in caps

并在将应用程序部署到服务器时添加以下方法:

app.listen(port, () => {
 console.info("Server started listening.");
});

我们可以在本地运行时将主机名作为第二个参数传递。但是在将其部署到服务器时,应删除主机名参数。

app.listen(port, hostName, () => {
  console.info(`Server listening at http://${hostName}:${port}`);
});

答案 15 :(得分:1)

我花了很多时间寻找根本原因,最终我发现这个超时(60 秒)是可以调整的。 Here 您可以将 60 秒更改为 120 秒甚至更多。它对我有用,希望对其他人有帮助!

答案 16 :(得分:0)

我建议您仔细阅读日志,以便轻松排除故障。 如果您将 PORT 作为环境变量 (env) 引用,请确保它是 PORT 而不是 port,因为在您部署应用程序时,heroku 会自动为其分配一个 PORT 编号。 process.env.PORT 不是 process.env.port

答案 17 :(得分:0)

要解决此问题,请执行以下四个简单步骤: 在 package.json 文件中:

1- 将主字段设置为服务器文件:

"main": "server.js" // <-- here set you server file

2- 在 app.listen 函数中添加 host 参数

const port = process.env.PORT || 3000;
const host = '0.0.0.0'
app.listen(port, host, ()=> connsole.log(`server is running on port ${port}`)

3- 将安装后脚本添加到 package.json 文件中

"scripts": {
     "postinstall": "npm run build", // <-- add this line
     "start": "node server.js" // <-- change server.js to you main file
}

4- 在 package.json 文件中添加引擎字段

"engines": {
   "node": ">=14.0.O", // <-- change it to your node version. you can "node -v" in you command line
   "npm": ">=7.7.0" // <-- change this to your npm version. you can use "npm -v" in the command line to get your npm version
}

如果您有任何成功,请告诉我!

答案 18 :(得分:0)

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

  "scripts": {
    "start": "node index.js"
  }

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

答案 19 :(得分:0)

我的情况是我在启动时运行数据库脚本并且花费了很长时间。我通过在部署完成后手动运行 type 解决了这个问题。

答案 20 :(得分:0)

即使我来不及,但这也可能会帮助在未来几天内也会陷于困境的人。 我遇到了同样的问题,但是我的问题是使用npm start运行许多命令。 我正在运行创建表并在启动应用程序之前插入数据,并在运行之前超过了10秒。因此,我删除了这些命令并解决了问题。

谢谢

答案 21 :(得分:0)

我的问题是,当部署到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不同。

贷记到gprasant

答案 22 :(得分: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应用程序便按预期部署。

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

I Use ReactJs



If you want upload to heroku add this in your webpack.config.js

Because if not add you will have
error

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

//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”
 })
 ]
};

答案 25 :(得分:0)

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

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

enter image description here

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

enter image description here

答案 26 :(得分:0)

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

答案 27 :(得分:0)

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

  

唯一需要特别考虑的是允许   heroku选择服务器要部署到的端口。除此以外,   可能有错误,例如请求超时。

     

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

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

答案 28 :(得分:0)

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

这是一个如何做到这一点的例子。在脚本对象上,在package.json中,添加一个start方法“node server --port $ PORT”。

在您的服务器文件中,使用yargs从start方法的端口选项(--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的动态设置值。

答案 29 :(得分:0)

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

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

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

答案 30 :(得分:0)

我有同样的问题我可以解决问题,替换&#39; localhost&#39;知识产权是&#39; 0.0.0.0&#39;