我正在尝试让 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 问题。
所以你有两个选择:
- 等待 http-proxy 重写其内部结构以应对 streams2。
- 降级到 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/