596

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

任何的想法 ?

4

36 回答 36

1276

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

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

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

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

于 2013-03-28T22:36:48.270 回答
72

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

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

worker: YOUR_COMMAND

然后也在 CLI 上运行:

heroku scale worker=1
于 2017-05-22T21:12:31.727 回答
55

当 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);
});
于 2014-08-21T05:35:27.783 回答
49

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

于 2017-11-21T18:56:02.873 回答
29

在使用 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'));
});
于 2015-08-02T20:06:06.073 回答
11

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

解决我更换的问题

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

server.connection({
    port: process.env.PORT || 3000 
});
于 2017-01-19T05:55:32.157 回答
9

更改此行

app.listen(port);

app.listen(process.env.PORT, '0.0.0.0');

它会起作用的

于 2020-09-14T07:43:48.207 回答
9

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

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

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

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

对此:

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

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

于 2021-01-03T16:26:04.530 回答
5

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

于 2018-09-26T13:22:54.980 回答
4

重新启动heroku中的所有测功机对我有用

在此处输入图像描述

于 2021-02-23T10:39:00.117 回答
3

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

于 2016-11-24T05:34:32.733 回答
3

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

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

server.listen(5000);
于 2019-10-07T17:56:37.363 回答
2

编辑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");
});
...
于 2017-12-14T11:54:33.667 回答
2

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

web: node app.js
于 2018-10-18T17:02:27.947 回答
2

我使用 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"
    })
  ]
};
于 2019-06-24T11:05:13.770 回答
2

用于process.env.PORT || 3000您的端口。

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

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

于 2021-05-26T16:27:02.727 回答
1

我有同样的问题我可以解决问题用 IP 替换 'localhost' 是 '0.0.0.0'

于 2017-07-16T18:55:27.767 回答
1

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

于 2021-02-14T11:05:52.337 回答
1

在开发应用程序时,我们需要通过以下方式定义 PORT:

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}`);
});
于 2021-02-19T21:17:52.253 回答
1

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

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

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

2-将主机参数添加到 app.listen 函数

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
}

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

于 2021-05-02T09:52:49.003 回答
1

在您的package.json文件中scripts,确保您的start脚本包含-p $PORT.

示例package.json(在这种情况下,对于 NextJS 应用程序):

{
  "private": true,
  "scripts": {
    "dev": "next dev -p 3001",
    "build": "next build",
    "start": "next start -p $PORT" // make sure to have $PORT in here
  },
  "dependencies": {
    "typescript": "^4.3.2"
  },
  "devDependencies": {
    "@next/eslint-plugin-next": "^11.1.2",
    "@types/mongoose": "^5.11.97"
    "typescript": "^4.3.2"
  }
  "license": "MIT"
}

于 2021-10-08T13:47:09.783 回答
0

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

你甚至可以添加你的回调函数。看看下面的代码

app.listen(process.env.PORT || 5000, function() {
    console.log("Server started.......");
});
于 2017-11-07T06:48:31.873 回答
0

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

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

于 2018-02-09T11:45:06.540 回答
0

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

这是您如何做到这一点的示例。在脚本对象的 package.json 中,添加一个启动方法“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 的动态设置值。

于 2018-03-01T05:05:17.790 回答
0

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

于 2018-05-13T16:49:12.683 回答
0

我有同样的问题,但快递和阿波罗服务器。来自这里的解决方案:

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

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

> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });
于 2018-10-02T18:33:50.807 回答
0

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

1) 由于从另一个入口文件运行应用程序,根本没有侦听器,并且此运行脚本已从 package.json "scripts" 中删除

在此处输入图像描述

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

在此处输入图像描述

于 2019-05-31T19:42:43.807 回答
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我们跑node app.js

显然这就是问题所在。一旦我将两者合并到一个文件中,Heroku 应用程序就会按预期部署。

于 2019-10-22T11:46:56.090 回答
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, not process.env.port,因为显然port不一样PORT

归功于gprasant 。

于 2020-02-09T01:30:09.063 回答
0

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

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

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

于 2020-10-21T20:51:45.677 回答
0

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

于 2021-07-08T18:14:05.447 回答
0

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

于 2021-08-02T13:20:11.070 回答
0

这也是解决错误的好方法

  const PORT = process.env.PORT || 3000                                                   
   app.listen(                                                                                 
    PORT,                                                                                                    
    '0.0.0.0',                                                                                
    function () {                                                                                                             
    console.log("Server started.......");                                                              
    }                                                                                                                   
  );
于 2021-09-08T13:35:08.303 回答
0

如果您收到此错误并且上述方法不起作用,则该错误不是来自 R10 本身。错误是由 R14(超出内存配额)引起的,这是因为您的部分代码使用了 multer(multer.diskStorage()方法)或其他一些库,用于使用某种形式的本地存储来存储图像或其他文件。由错误 R14 引起的延迟会导致 R10(引导超时)错误。

解决方案:

在您的 package.json 文件中,将您的开始更改为“start”:“node --max-old-space-size=4096 server/index.js”。这会增加存储大小。

设置这个 heroku 变量 heroku canfig:set NODE_ENV=dev

于 2021-09-26T21:43:24.553 回答
0

我浪费了一整天的时间认为后端有问题。在浏览了这里的所有解决方案并进行了彻底的日志检查后,意识到问题出在前端 react App.js 上。

我改变了每一个

Axios.post(`${process.env.REACT_APP_BASE_URL}/createOrder`, {

})

Axios.post(`/createOrder`, {

})

它奏效了!

显然反应文件与heroku部署无关!

于 2022-01-19T22:13:15.947 回答
-1

对我来说,问题是大写。你知道,经过几个小时的编码,你的眼睛会错过一些小细节。

在我的代码中,我使用的process.env.port不是process.env.PORT,所以请注意,PORT环境变量必须大写。

请参见下面的示例:

const PORT = process.env.PORT || 3000;
const HOST = process.env.HOST || '0.0.0.0';

const express = require('express');
const app = express();

app.listen(PORT, HOST, () => {
      console.log('Server started on ' + HOST + ':' + PORT);
})
于 2021-10-14T12:53:38.740 回答