我按照socket.io的在线聊天教程进行聊天应用程序。在我的app.js文件中(我使用快速生成器)我有......
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
这意味着我需要浏览(因此我的套接字服务器正在运行)...
在我的页面上,我有一行......
var socket = io.connect('http://localhost:3000');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
当我在本地运行应用程序时,套接字应用程序正常工作。但是为了部署它,我使用了heroku / node buildpack,当我的应用程序部署时,它在端口80上运行,例如在app.heroku.com上。我有两个问题......
1)部署后我的应用程序如何在不同的端口上? (这发生在哪里?) 2)如何设置我的页面以始终查看正确的URL和端口?
答案 0 :(得分:1)
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
这很好。请记住,这没有任何作用,它只是您应用中的任意设置值。为了收听该端口,您必须稍后告诉您的服务器,例如app.listen(app.get('port'))
。
var socket = io.connect('http://localhost:3000');
这是您想要改变的地方:
var socket = io.connect();
当您在Heroku上托管时,您无法连接到" localhost:3000" (而是yourapp.herokuapp.com:80,或customdomain.com:80)。因此,通过指定localhost:3000,您无法找到自己的服务器。
答案 1 :(得分:0)
通过Heroku运行时,您应该连接到端口80。如果您希望本地和Heroku实现都使用您的客户端代码,请更改此:
var port = normalizePort(process.env.PORT || '3000');
到此:
var port = normalizePort(process.env.PORT || '80');
并确保您的本地安装具有在端口80上运行的权限。然后,您的客户端始终可以在本地或通过Heroku在端口80上访问它。
或者,如果由于特权原因在端口80上本地运行不方便,那么您可以将端口3000留在那里进行本地安装,并在本地服务器上配置本地iptable,以便端口80自动请求转发到服务器进程所在的端口3000。
Heroku使用共享基础架构,在同一台服务器上运行许多不同的进程,每个进程在process.env.PORT
指定的自己的端口上运行,并为每个单独的服务器进程单独配置。
但是,当您在端口80上访问您的特定域时,运行您的进程的服务器前面的某种网络基础结构(可能是某种路由器或负载均衡器)会将该端口80请求重定向到您的域到运行您的进程的实际服务器上的端口process.env.PORT
请求。因此,发生了两件事。 1)多个服务器进程可以在每个独立端口上的同一服务器盒上运行,2)每个单独的域都可以在端口80上访问,该端口将自动转发到实际服务器上实际运行的进程的任何端口框。
顺便提一下,如果您将客户端代码更改为:
io.connect();
然后,客户端将只连接到网页加载的任何端口(自动使用相同的源),这几乎总是你想要的。