语境
我正在尝试在 NodeJS 中构建一个新的 Web 应用程序。这个 webapp 使用两个主要组件。
1) 我在 NodeJS 中编写的代码——也就是我自己的逻辑流程。
2)使用 HTTP 和 Socket.io的第 3 方开源 NodeJS 应用程序 - EtherCalc
EtherCalc 本身就是一个完全独立的 Web 应用程序。它是一个浏览器+服务器中的电子表格,旨在用作独立应用程序。重要的是,它有自己的命名空间(因为它有各种路径名可以路由到不同的函数)。
我的应用程序和 EtherCalc 各自在各自的端口上独立运行。
为简单起见,让域名为localhost
.
我打算解决的挑战
我的应用程序将使用 EtherCalc 的电子表格功能,以及我自己的代码的非电子表格相关的逻辑流程。用户将可以访问这两个界面。但是,我希望这一切看起来都来自一个 URL/端口——我不希望非程序员指定不同的端口来访问不同的功能。
对我来说解决这个问题的最简单方法是在我的应用程序中为 EtherCalc 创建一个命名空间。任何以/ethercalc/
自动开头的路径都会被转发到运行 EtherCalc 的端口(在ethercalc/
转发之前从请求 URL 中删除)。任何不以此开头的内容都保留在标准服务器逻辑流程中。
我正在使用node-http-proxy
以下代码来实现这一点:
proxy.proxyRequest(req,res,{
host:'localhost',
port:8000
});
我遇到的问题
最初这似乎运行良好 - 当我转到任何/ethercalc/
url 时,电子表格界面就会加载。但是,EtherCalc 使用 WebSockets 或 JSON Polling 以使服务器和浏览器保持在同一页面上。这似乎无法正常工作。出于某种原因,实际连接起来需要 10 秒的时间。如果我处理过电子表格,然后再次加载它,这尤其成问题 - 在我真正看到我事先输入的数据之前有 10 秒的窗口。
出现此问题后是删除 url 更改功能。现在我的应用程序只是将请求转发到运行 EtherCalc 的端口。但是,问题仍然存在。直接连接到 EtherCalc 所在的端口可以解决问题。
重写代码以使用 node-http-proxy 的httpProxy.createServer()
代码也没有什么不同 - 完全相同的结果......
奇怪的是,当连接到我的应用程序端口(具有代理/转发系统的端口)时,经过漫长的等待期后,它运行良好 - 一切都完全实时同步。
有人知道这是怎么回事吗?
TL;博士
- 我在 NodeJS 中有一个面向 HTTP 端口 80 的网络应用程序。
- 我在 NodeJS 中有一个使用 Socket.IO ( EtherCalc ) 在非公共端口上的同一服务器上运行的第 3 方 Web 应用程序。
- 我想将我自己的 webapp 中的网页和 EtherCalc 中的网页提供到端口 80 上的相同域名。
- 我
node-http-proxy
在我的 webapp 上运行了一个代理 ( ) 来实现这一点。 - 出于某种原因,当我这样做时,在浏览器和 EtherCalc 的服务器之间发生的握手(现在通过代理运行)需要永远。(或者更确切地说是 10 秒,对于面向消费者的网页来说,AKA 是不可接受的)
- 我不知道为什么会这样。
任何线索/提示/建议/线索?Socket.IO 对我来说是全新的——我已经使用 Node 很长一段时间(2 年),但它完全是在 HTTP 世界中。代理对我来说也是新的(这是我第一次使用代理 - 将它用于命名空间/端口问题)。因此,我真的不知道从哪里开始寻找。