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

76

我使用以下代码启动了一个node.js服务器,以设置端口:

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

这意味着它应该读取PORT环境变量或默认为8080,就像在本地运行时一样。但这两种情况在Heroku上都没有发生,服务器总是使用默认端口80。您有什么想法如何更改它?

heroku config
PORT: 8080

heroku config:get PORT会给你什么信息?另外,你可以尝试使用heroku config:unset PORT命令,看看是否会采用硬编码的默认端口。 - tgo
1
'heroku config:get PORT' 给了我 8080,但应用程序在80上服务。在使用 'heroku config:unset' 后没有变化。 - Crocodile
嘿,你接受了一个答案,但它似乎并不像一个答案,在我的情况下,Heroku上的process.env.PORT未定义,我有点卡在这里。 - Mathijs Segers
8个回答

102

你不能这样做。Heroku设置了端口变量,你需要绑定该变量,并监听tcp/80端口。


那么,在 app.js(或启动脚本)中,我应该使用什么端口?`var server = http.createServer(sendSMSHandler);server.listen(PORT);` - user3465521
23
你可以使用类似以下代码:var port = process.env.PORT || 3000; app.listen(port, function() { // 这里放监听端口的回调函数 }); 这段代码是用于设置服务器监听的端口号,其中process.env.PORT表示使用环境变量中指定的端口号,如果没有指定,则默认为3000。然后通过调用app.listen()方法,在指定的端口上启动服务器,并在回调函数中处理相关逻辑。 - metatron

40

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

port = process.env.PORT || 80

如果端口未设置,它会将端口设置为80。


2
这个解决方案对我有效。 - Chandler Bing
2
我不明白。你的回答就是问题本身... - E. Zacarias

21

所有回答都很好!我想简单解释一下理论,让人们了解为什么Heroku将它的端口设置为80或443。

计算机必须使用不同的协议来相互通信,因此需要创建一种约定。例如 HTTP、HTTPS、SSH、FTP等。

结果,就达成了这样一个协议:计算机通过端口80进行HTTP通信,https在端口443上通信,其它协议也有类似的约定。下面是显示所有协议的传统保留端口号的表格。

图片描述

现在你可能会想,如果这些是保留端口号,那我的电脑为什么可以让我使用端口号80和443呢(如localhost:80)?实际上,你可以使用任何端口号(事实上你可以选择多达65,535个端口号),但一旦你想要部署到线上并希望其他人使用你的应用程序,那么你就需要开始使用80端口(HTTP)或443端口 (https) 的约定。

Heroku 通过提供一个环境变量process.env.PORT,为您提供适用于正确的传统端口号,以便其他人可以访问您的应用程序。


11
Heroku处理Web应用程序与任何其他应用程序一样,并不允许您直接分配侦听端口。 Heroku将为您的Web服务器分配动态端口,但是要访问它,您需要使用默认端口(80)。
在Heroku上,应用程序完全自包含,不依赖于将Web服务器注入执行环境以创建面向Web的服务。每个Web进程仅绑定一个端口,并监听该端口上收到的请求。要绑定的端口由Heroku分配为PORT环境变量。
与Heroku的合同是进程绑定端口以提供请求。然后,Heroku的路由器负责将HTTP请求定向到正确端口上的进程。
参考:Heroku Runtime Principles - Web Servers

这个可以运行。如果需要,也可以在日志中查看分配的端口,并且该应用程序可以通过相同的端口访问。 - user1329695

8

例如,您可以做到:

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

app.listen(PORT, () => console.log(`Server is listening on port ${PORT}...`));

4
在我的情况下,Heroku 监听的是默认的 HTTPS 端口:443,并且无法通过 heroku config:get PORT 查看。

2
我也是。我将配置变量设置为端口5000,但花了4个小时才发现它并不起作用。无论如何,它都使用80端口(用于HTTP)和443端口(用于HTTPS)。实际上,在发现这一点后,我找到了这篇文章,看看是否有任何文档可以参考。 - Juanu

2

80 是默认端口,所以请使用 80 而不是 30008000

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接