node.js:代理websockets到其他端口

我在运行在端口80上的node.js中编写了http代理。我所需要的只是将socket.iostream量redirect到端口9090,并将标准httpstream量redirect到8080上的Apache。这是我的代理代码:

httpProxy = require('http-proxy'); httpProxy.createServer(function (req, res, proxy) { if (req.url.match(/socket.io/)) { proxy.proxyRequest(req, res, { host: 'localhost', port: 9090 }); } else { proxy.proxyRequest(req, res, { host: 'localhost', port: 8080 }); } }).listen(80); 

一切正常,但io.socket回落到xhr-polling。

 http://localhost/client.htm - falls back to xhr-polling file:///C:/.../client9090.htm - still uses websocket 

socket.io应用程序在端口9090上运行,client.htm连接到80,而client9090.htm直接连接到9090。

它看起来像一个节点HTTP代理使socket.io应用程序在xhr轮询模式下工作。 客户端是Chrome v.25

socket.io应用程序代码

 var io = require('socket.io').listen(9090); io.on('connection', function (socket) { socket.on('hi!', function (data) { console.log(data); socket.emit('news'); }); socket.on('ahoj', function (data) { console.log(data); }); }); 

client.htm代码

 <script src="http://localhost/socket.io/socket.io.js"></script> <script> var chat = io.connect('http://localhost') chat.on('connect', function () { chat.emit('hi!'); }); chat.on('news', function () { chat.emit('ahoj',{a:1,b:2}); }); </script> 

client9090.htm是相同的,但localhost由localhost:9090replace

正如我所说,everythig运作良好,唯一的问题是,node-http-proxy使从websockets退回到xhr-polling。 谁能帮忙?

根据https://npmjs.org/package/http-proxy ,在向httpProxy.createServer()添加callback时,必须手动代理“升级”事件,如下所示:

 httpProxy = require('http-proxy'); // added `var server =` here var server = httpProxy.createServer(function (req, res, proxy) { if (req.url.match(/socket.io/)) { proxy.proxyRequest(req, res, { host: 'localhost', port: 9090 }); } else { proxy.proxyRequest(req, res, { host: 'localhost', port: 8080 }); } }).listen(80); // added upgrade listener section here: server.on('upgrade', function (req, socket, head) { server.proxy.proxyWebSocketRequest(req, socket, head); }); 

但是,对于上面描述的用法,您甚至不需要callback函数 – 您可以轻松地做这样的事情:

 httpProxy = require('http-proxy'); var options = { pathnameOnly: true, router: { '/wiki': '127.0.0.1:8001', '/blog': '127.0.0.1:8002', '/api': '127.0.0.1:8003' } } var proxyServer = httpProxy.createServer(options); proxyServer.listen(80);