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

赫罗库+;node.js错误(Web进程未能在启动后60秒内绑定到$PORT),node.js,heroku,Node.js,Heroku,我有我的第一个node.js应用程序(在本地运行良好)-但我无法通过heroku部署它(第一次也是使用heroku)。代码如下。所以我不想写那么多代码,所以我只想说,在我的网络中本地运行代码没有问题 var http = require('http'); var fs = require('fs'); var path = require('path'); http.createServer(function (request, response) { console.log

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

有什么想法吗?

Heroku会动态地为你的应用程序分配一个端口,因此你不能将端口设置为固定的数字。Heroku将端口添加到env中,这样您就可以从那里提取它。切换您的手机,请听以下内容:

.listen(process.env.PORT || 5000)
这样,当您在本地测试时,它仍将侦听端口5000,但它也将在Heroku上工作


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

当Heroku无法在
服务器上绑定端口或主机名时,会发生错误。请侦听(端口、[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);
});

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


在我的例子中,我将Babel与Babel插件转换内联环境变量一起使用。显然,Heroku在进行部署时没有设置PORT env变量,因此
process.env.PORT
将被
undefined
替换,并且您的代码将退回到Heroku不知道的开发端口。

在我的例子中,我使用了

为了解决我替换的问题

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


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

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

然后还可以在CLI上运行:

heroku scale worker=1

我也有同样的问题,我可以用IP替换“localhost”,它是“0.0.0.0”

无法为端口设置固定的数字,heroku使用
process.env.port
动态分配它。但是您可以同时添加它们,就像这样
process.env.PORT | | 5000
。Heroku将使用第一个,而您的本地主机将使用第二个

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

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

对于同时传递端口和主机的用户,请记住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.......");
});

您可以在此处查看更多详细信息:

编辑
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");
});
...

在所有我尝试过的解决方案中,没有一个像预期的那样工作,我研究heroku默认情况下.env文件应该维护约定端口,process.env.PORT,heroku默认情况下会查找关键字PORT


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

在heroku bash进程中,使用选项解析器(如yargs)将$PORT的值传递给节点应用程序

下面是一个示例,说明您可以如何做到这一点。在scripts对象的package.json内部,添加一个启动方法“node server--port$port”

在服务器文件中,使用yargs从start方法的port选项(--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值。

如果像我一样,你正在配置Heroku从部署时的
包.json
文件运行脚本,请确保你没有在该脚本中硬编码
PORT
的值!如果你这样做,你最终会像我一样,花一个小时试图找出为什么会出现这个错误。

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

我也遇到了同样的问题,但express和apollo server出现了同样的问题。解决方案来自:

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

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


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

web: node app.js

就我而言,我有两个问题

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

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

我使用ReactJs, 如果您想上传到heroku,请将其添加到webpack.config.js中

因为如果不添加,您将有错误

错误R10(启动超时)->Web进程无法绑定到内的$PORT 发射60秒


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

listen()
调用可以没有主机和回调:

server.listen(5000);

在我的例子中,端口和主机都不是问题所在。
index.js
被分为两个文件
server.js

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
//server.js
const express=require('express')
const path=require('路径')
const app=express()
app.use(express.static(path.resolve(uu dirname,'public'));
//还有所有其他的东西
module.exports=app
//app.js
const app=require(“./server”);
const port=process.env.port | 3000;
应用程序侦听(端口'0.0.0.0',()=>{
有限公司
> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });
web: node app.js
//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"
    })
  ]
};
server.listen(5000);
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}`)
})
app.listen(port);
app.listen(process.env.PORT, '0.0.0.0');
  "scripts": {
    "start": "node index.js"
  }
"start": "npm run build && node server.js"
"postinstall": "npm run build",
"start": "node server.js"
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}`);
});