2

语境

我正在尝试在 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;博士

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

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

4

0 回答 0