在 Heroku 上设置节点 .js 服务器的端口

Setting the port for node.js server on Heroku

提问人:Crocodile 提问时间:2/25/2015 更新时间:6/29/2022 访问量:128323

问:

我启动了一个 node.js 服务器,其中包含以下行来设置端口:

app.set('port', process.env.PORT || 8080);

这意味着,它应该读取 PORT env 变量或默认为 8080,就像在本地运行时一样。它们都没有发生在 Heroku 上,服务器始终使用默认端口 80。知道如何改变它吗?

heroku config
PORT: 8080
节点 .js Express Heroku-Toolbelt

评论

0赞 tgo 2/25/2015
什么给你?此外,您可以尝试查看您的硬编码默认值是否被选中。heroku config:get PORTheroku config:unset PORT
1赞 Crocodile 2/25/2015
“heroku config:get PORT”给了我 8080,但该应用程序在 80 上提供服务。在“heroku config:unset”之后没有变化
0赞 Mathijs Segers 1/9/2019
嘿,你接受了一个答案,但它看起来并不像一个答案,就我而言,process.env.PORT在heroku上是未定义的,我有点卡在这里。

答:

102赞 punund 2/25/2015 #1

你不能。Heroku 设置您应该绑定的 PORT 变量,并侦听 tcp/80。

评论

0赞 8/30/2015
那么,在 app.js(或启动脚本)中,我使用什么作为端口?var server = http.createServer(sendSMSHandler); server.listen(PORT);
23赞 metatron 11/7/2016
@broderickga 你可以使用这样的东西:var port = process.env.PORT ||3000;app.listen(端口, 函数() {
11赞 gomisha 7/28/2018 #2

Heroku 将 Web 应用程序视为任何其他应用程序,并且不允许您直接分配侦听端口。您的 Web 服务器将由 Heroku 分配一个动态端口,但要访问它,您需要使用默认端口 (80)。

在 Heroku 上,应用程序是完全独立的,不依赖于 运行时将 Web 服务器注入到执行环境中,以 创建面向 Web 的服务。每个 Web 进程都简单地绑定到一个端口, 并侦听该端口上传入的请求。要绑定到的端口 由 Heroku 指定为 PORT 环境变量。

与 Heroku 签订的合同是将流程绑定到要服务的端口 请求。然后,Heroku 的路由器负责指导 HTTP 在正确的端口上请求进程。

参考:Heroku 运行时原则 - Web 服务器

评论

0赞 4/8/2019
这行得通。如果需要,还可以在日志中看到分配的端口,并且可以通过相同的端口访问应用程序。
40赞 E. Murimi 10/15/2018 #3

您应该像这样使用 heroku 打开的端口:

port = process.env.PORT || 80

如果尚未以某种方式设置端口,则会将端口设置为 80

评论

2赞 Chandler Bing 10/22/2021
这个解决方案对我有用。
2赞 E. Zacarias 4/25/2022
我不明白。你的答案就是问题本身......
4赞 wscourge 1/15/2019 #4

就我而言,heroku 正在侦听默认的 HTTPS 端口:并且它通过 .443heroku config:get PORT

评论

2赞 Juanu 6/2/2020
同样在这里。我将 Config Vars 设置为端口 5000,我花了 4 个小时才弄清楚它不在乎。无论如何,它都使用端口 80(用于 HTTP)和 443(用于 HTTPS)。我实际上是在发现并查看是否有任何文档后找到这篇文章的。
8赞 mkupiniak 9/25/2019 #5

例如,您可以执行以下操作:

const PORT = process.env.PORT || 5001;

app.listen(PORT, () => console.log(`Server is listening on port ${PORT}...`));
21赞 ousecTic 8/20/2020 #6

所有的答案都很棒!想稍微谈谈这个理论,以便人们理解为什么 Heroku 将其端口设置为 80 或 443。

计算机必须创建一个约定,以便使用不同的协议相互通信。例如 HTTP、HTTPS、SSH、FTP 等。

因此,达成了一项协议,即计算机将与端口 80 进行 HTTP 通信,在端口 443 上进行通信,依此类推。下表显示了协议的所有常规预留端口号。https

enter image description here

现在你们中的一些人可能会想,如果这些是保留端口号,为什么我的计算机允许我使用端口号 80 和 443(例如 localhost:80)。您可以使用任何端口号(实际上,您最多可以选择 65,535 个端口号),但是一旦您想要部署到实时并希望其他人使用您的应用程序,那么您将不得不开始使用端口 80 (HTTP) 或端口 443 () 的约定。https

Heroku 通过提供一个环境变量来申请正确的常规端口号,以便其他人可以访问您的应用程序,从而让您变得友好和轻松。process.env.PORT

2赞 Rashid Iqbal 12/19/2020 #7

80 是默认端口,因此请使用 80 而不是 3000 或 8000

const PORT = process.env.PORT || 80;
var server = app.listen(PORT, function() {
    var host = server.address().address;
    var port = server.address().port;
    console.log("server is listening at http://%s:%s", host, port);
});
0赞 fabiosalvi 6/29/2022 #8

Heroku 上可以使用不同的端口,只要主$PORT也使用即可。 查看 https://stackoverflow.com/a/43911373/9646899