使用nodeJS的自定义path代理WebSockets和HTTP到单独的NodeJS应用程序?

CONTEXT

我正在尝试在NodeJS中构build一个新的Web应用程序。 这个webapp使用两个主要组件。

1)我在NodeJS中编写的代码 – 也就是我自己的逻辑stream程。

2)第三方开源NodeJS应用程序 – EtherCalc – 同时使用HTTP和Socket.io

EtherCalc是一个完全独立的Web应用程序。 这是一个电子表格在浏览器+服务器,旨在作为一个独立的应用程序使用。 重要的是,它有自己的命名空间(就像它有不同的path名称,可以路由到不同的function)。

我的应用程序和EtherCalc各自运行在彼此独立的端口上。

为了简单起见,让域名为localhost

挑战我想要解决

我的应用程序将使用EtherCalc的电子表格function,以及我自己的代码的非电子表格相关的逻辑stream程。 用户将有权访问这两个接口。 不过,我想这一切似乎来自一个URL /端口 – 我不希望非程序员指定不同的端口来访问不同的function。

解决这个问题的最简单的方法是在我的应用程序中为EtherCalc创build一个名称空间。 以/ethercalc/自动开始的任何path将被转发到运行EtherCalc的端口(在转发之前, ethercalc/从请求URL中删除)。 任何不以标准服务器逻辑stream程开始的东西。

我使用node-http-proxy来实现这一点,使用下面的代码:

  proxy.proxyRequest(req,res,{ host:'localhost', port:8000 }); 

我遇到了问题

这似乎最初运行良好 – 电子表格界面加载时,我去任何/ethercalc/url。 但是,EtherCalc使用WebSockets或JSON轮询来保持服务器和浏览器在同一页面上。 这似乎没有正常工作。 出于某种原因,实际上需要10秒钟才能完成连接。 如果我在电子表格上工作,然后再加载它,这是特别有问题的 – 在我实际看到事先放入的数据之前,有10秒的窗口。

有这个问题之后,要删除url更改function。 现在我的应用程序只是将请求转发到EtherCalc正在运行的端口。 但是,问题依然存在。 直接连接到EtherCalc所在的端口可以解决问题。

重写代码来使用node-http-proxy的httpProxy.createServer()代码也没有什么区别 – 完全相同的结果…

奇怪的是,当连接到我的应用程序端口(具有代理/转发系统的应用程序端口)之后,在漫长的等待期之后,它的function就很好 – 所有事情都是实时同步的。

有谁知道这是怎么回事?

TL; DR

  1. 我有一个面向HTTP端口80的NodeJS中的Web应用程序。
  2. 我在NodeJS中使用运行在非公共端口上同一服务器上的Socket.IO( EtherCalc )的第三方Web应用程序。
  3. 我想从我自己的Web应用程序和从EtherCalc网页服务的网页到端口80相同的域名。
  4. 我有一个代理( node-http-proxy )运行在我的Web应用程序,使之成为可能。
  5. 出于某种原因,当我这样做时,发生在浏览器和EtherCalc服务器(现在通过代理运行)之间的握手需要FOREVER。 (或者说10秒,AKA不能接受面向消费者的网页)
  6. 我不知道为什么会发生这种情况。

任何线索/提示/build议/线索? Socket.IO对我来说是全新的 – 我已经使用Node很长一段时间(2年),但它完全在HTTP世界。 代理对我来说也是新的(这是我第一次使用它 – 用于命名空间/端口问题)。 因此,我真的不知道从哪里开始寻找。