2011-09-26 126 views
3

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

我的代码是:

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

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

​​

你会看到代理工作。

不知道如何解决它,如果express.static使用

Marak大地主回应了错误report

这是一个明确的问题。 Connect/Express中间件正在为您的响应对象做非标准的事情, 中断流。尝试使用原始request模块而不是http-proxy。 如果您需要正确的中间件堆栈,检查出https://github.com/flatiron/union

+0

事实上,经过一段时间后,我决定采取相反的行动。如果请求了静态文件,Nginx将为它们提供服务。如果请求一些动态文件,那么Nginx将它们代理到我的node.js应用程序。我认为这是更多Nginx的工作来提供静态文件。 – Luc

+0

现在有同样的问题并使用相同的解决方案。仍然讨厌使用静态代码破坏代理 –

2

由于对HTTP代理issue 180故障描述是与上面提到的连接完成的非标准化的东西:

使用NPM安装连接-restreamer使这个最后的项目在你的快递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 
    } 
    }); 
}) 

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