2

我正在扩展我与 mikeal 的请求模块放在一起的 node.js 反向代理:https ://github.com/mikeal/request 。它是一个连接应用程序,它使用一小块自定义中间件来检查当前请求是否是针对 API 路由的,如果是,它会像这样将其代理到不同的 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 请求实际上并没有工作(客户端似乎永远不会建立连接)。有没有更好的方法来实现这一点

4

0 回答 0