我有一个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);
答案 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字符串的请求。