使用node.js代理http和websocket流量

时间:2014-05-14 19:21:21

标签: node.js websocket reverse-proxy atmosphere node-http-proxy

我正在扩展我与mikeal的请求模块https://github.com/mikeal/request放在一起的node.js反向代理。它是一个连接应用程序,它使用一小块自定义中间件来检查当前请求是否是针对API路由的,如果是,则将其代理到不同的API服务器,如下所示:

  .use(function(req, res, next){
    if( /^\/api\//.test(req.url) ){  
      req.pipe(request(apiUrl + req.url))
        .on('error', function(err){
          handlePipeError(err, 'Error piping request to proxy server. Details: ');
        })
        .pipe(res)
        .on('error', function(err){
          handlePipeError(err, 'Error piping proxy response to client. Details: ')
        });


      function handlePipeError(err, customMsg) {
        console.log( customMsg, err );

        res.writeHead(503, {
          'Content-Length': Buffer.byteLength(err.message, 'utf8'),
          'Content-Type': 'text/plain' });
        res.end(err.message);
      }
    }
    else {
      next();
    }

还有一些其他中间件可以处理静态文件服务和其他一些东西。一旦设置了所有中间件,我就像这样启动服务器:

var server = require('http').createServer(app);
server.listen(port)

我现在想扩展此脚本以允许反向代理websocket连接。我尝试使用nodejitsu / node-http-proxy来修改代码的前一部分,如下所示:

var options = {
  ws: true,
  target: apiUrl,
  secure: false,
  xfwd: true
};
var wsProxy = require('http-proxy').createProxyServer(options);

var server = require('http').createServer(app);

server.on('upgrade', function (req, socket, head) {
  console.log("--- CAUGHT UPGRADE ----");
  wsProxy.ws(req, socket, head);
});

server.listen(port);

我注意到升级事件触发并且回调函数确实运行但是websockets请求实际上没有工作(客户端似乎永远不会建立连接)。有没有更好的方法来实现这个

0 个答案:

没有答案