javascript - 带有 proxytable 和 websockets 的 Node http 代理

标签 javascript node.js websocket node-http-proxy

我正在尝试让 websockets 也与 node-http-proxy 一起工作。不同之处在于我使用的是代理表:

var options = {
router: {
    'a.websterten.com': '127.0.0.1:150',
    'b.websterten.com' : '127.0.0.1:151',
}
};

var server = httpProxy.createServer(options);

我试过:

server.on('upgrade', function (req, socket, head) {
    server.proxy.proxyWebSocketRequest(req, socket, head);
});

但是好像不行。快速检查 websockets 是否工作表明我从 Chrome 中得到 Unexpected response code: 400(如果我直接去,工作正常)

同时进行一些检查 server.on('upgrade',.. 不会在 websocket 请求时触发

如何让我的代理服务器正确路由 websockets?

我也在 Node 0.8.23 和 Node 0.10.x 上尝试过这个( Node 的更高版本有内存泄漏问题,但它不会在 0.8.23 上工作)

最佳答案

当您使用 httpProxy.createServer() 时,无需处理 upgrade 事件,因为 http-proxy 会自动处理它。因此,您的 server.on('upgrade', ...) 永远不会触发,因为 http-proxy 已经在内部处理它。

您唯一需要执行 server.on('upgrade') 的时间是当您将中间件函数传递给 httpProxy.createServer 或者您手动创建了使用 http.createServer() 的服务器。

换句话说,websockets 应该通过您配置中的代理“正常工作”。


但是, http-proxy 中的 WebSocket 支持是 currently broken on node v0.10.x因为 streams2( Node 核心中的流 API were completely rewritten in 0.10)。 此外,由于botched fix,最新版本的http-proxy (0.10.2) 在 Node v0.8 中被破坏。对于 streams2 问题。

所以你有两个选择:

  1. 等待 http-proxy 重写其内部结构以应对 streams2。
  2. 降级到 Node v0.8.23 和 http-proxy 0.10.1。 (至少在 #1 发生之前。)

(您可以通过运行 npm install http-proxy@0.10.1 安装旧版本的 npm 模块。)

关于javascript - 带有 proxytable 和 websockets 的 Node http 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16503349/

相关文章:

javascript - AngularJS 模板标题未呈现

javascript - (修改 JSFiddle)如何根据您在上一个下拉框中选择的内容使下拉框仅可见?

javascript - TypeError : promise. then(...).then(...).then(...).then(...).catch 不是 Node Js 中的函数

firefox - 关闭或刷新时的 websockets firefox

tcp - WebSockets ping/pong,为什么不是 TCP keepalive?

javascript - 如何在 react 中调用onClick中的多个方法?

javascript - 当我返回起始页时按钮不起作用

javascript - Node 请求IP地址与远程IP地址不同

node.js - 如何使用connection.db.collection函数?

websocket - 解码一个 websocket 帧