nodejs代理没有响应

时间:2011-09-26 21:33:16

标签: node.js proxy

我有一个node.js应用程序,它提供静态文件(html,js,css)。在静态文件中,完成了一些ajax请求(在请求中使用/ TEST)。我需要将这些请求代理到localhost上运行的另一台服务器:213445。静态页面被正确显示,但是当涉及到代理请求时,它会永远挂起......

我的代码是:

var express = require("express");
var httpProxy = require('http-proxy');
var fs = require('fs');

// Create https server
var app = express.createServer({
    key: fs.readFileSync('privatekey.pem'),
    cert: fs.readFileSync('certificate.pem')
});

// Handle static files
app.use(express.static(__dirname + '/public'));

// Proxy request
app.all('/TEST/*',function(req, res){
  // Remove '/TEST' part from query string
  req.url = '/' + req.url.split('/').slice(2).join('/');

  // Create proxy
  var proxy = new httpProxy.HttpProxy();
  proxy.proxyRequest(req, res, {
     host: 'localhost',
     port: 21345,
     enableXForwarded: false,
     buffer: proxy.buffer(req)
  });
});

// Run application
app.listen(10443);

2 个答案:

答案 0 :(得分:2)

我有同样的问题。如果您注释掉

// Handle static files
app.use(express.static(__dirname + '/public'));

你会看到代理工作。

如果使用express.static,则不确定如何修复

Marak Squires回应了错误report

  

这是一个明确的问题。   Connect / Express中间件正在为您的响应对象执行非标准操作,   打破流媒体。尝试使用原始request模块而不是http-proxy。   如果您需要适当的中间件堆栈,请查看https://github.com/flatiron/union

答案 1 :(得分:2)

如http-proxy issue 180所述,问题与上述连接所做的非标准事情有关:

使用npm安装connect-restreamer并将其作为express的app.configuration中的最后一项:

app.use(require('connect-restreamer')());

然后执行以下操作:

var httpProxy = require('http-proxy');
var routingProxy = new httpProxy.RoutingProxy();

app.get('/proxy/', function (req, res) {
  routingProxy.proxyRequest(req, res, {
    target: {
       host : host,
       port : port
    }
  });
})

这会将整个网址(包括“/ proxy /”)传递给目标主机。您可以在proxyRequest()进入{{1}}之前rewrite/modify the headers of the req,例如想要模仿来自特定CNAME虚拟主机或不同URL字符串的请求。