【问题标题】:I don't have to specify a port for heroku for my socket.io app?我不必为我的 socket.io 应用程序指定 heroku 的端口吗?
【发布时间】:2015-04-29 17:29:21
【问题描述】:

我已经成功地制作了一个测试聊天应用程序,并且我已经获得了一个在 heroku 上运行 socket.io 的节点 js 服务器。在我的本地计算机上,我必须将客户端上 localhost 的端口号指定为服务器设置的端口。但是,当我在 heroku 上运行我的服务器代码时。删除服务器

我正在使用 process.env.PORT 变量,因为 heroku 设置了它:

var port = process.env.PORT || 3000;
http.listen(port, function(){
  console.log('listening on *:' + port);
});

我自然会在 url 中找到运行应用程序的端口号

var socket = io('https://xxxx.herokuapp.com:1111');

但是,这给了我一个“net::ERR_CONNECTION_REFUSED”。

我通过删除 url 之后的端口号(在本例中为:1111)来使其工作。我想知道为什么这是有效的,因为大多数在线教程和文章都指定了端口以及为什么我的本地计算机也需要该端口才能工作。

【问题讨论】:

  • heroku 上的 console.log 输出到哪里?

标签: javascript node.js heroku socket.io


【解决方案1】:

当您通过端口 443(未指定端口时用于 https 连接的端口)连接到 heroku 上的 https://xxxx.herokuapp.com 子域时,Heroku 可能正在使用代理或路由器将该传入连接路由到您的 node.js 服务器正在侦听的特定端口。在 Heroku 基础架构中,他们知道您的服务器正在运行的实际内部主机以及正在运行的实际端口号,因此他们可以将您子域上的默认端口请求映射到实际端口/主机。

这样做是为了让浏览器可以直接在默认端口上连接到您的子域,而无需知道您的节点服务器安装的详细信息,并且 Heroku 可以自动管理您的服务器并可能与其他客户共享硬件。你们每个人都在不同的端口上运行,但共享同一台机器。这些端口完全由 Heroku 管理,这是他们能够将多个客户放在同一硬件上的一种方式,而无需每个客户都必须在浏览器 URL 中指定自定义端口(这对于大多数客户来说都是不可行的)。

因此,Heroku 正在为您的子域托管某种代理,该代理正在侦听默认的 https 端口。因此,您不必在 URL 中指定端口。在内部,它们将该连接路由到您实际服务器上的实际端口。

在您的桌面上运行时,没有这样的代理可以为您执行此操作,因此您必须确保客户端和服务器端口号匹配。

【讨论】:

  • 谢谢!很好的解释。出于这个原因,他们希望您使用 process.env.PORT b/c 是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2018-03-03
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多