在Node上使用connect库,我尝试在使用node-http-proxy代理请求正文之前检索请求正文。
从Node v4开始,我们必须使用bodyParser之类的中间件(或者只是请求 data / end 事件)来检索POST请求体。
问题是,似乎使用请求流,并且代理时请求超时。
以下是代码,首先我使用 data 事件检索正文,然后将其提供给http-proxy,但请求超时。
var httpProxy = require('http-proxy');
var connect = require('connect');
var proxy = new httpProxy.createProxyServer({
target: {
host: 'localhost',
port: 9015
}
});
var app = connect()
.use(function (req, res, next) {
var bodyBuffer = '';
req.on('data', function (data) {
bodyBuffer += data;
});
req.on('end', function () {
req.body = buffer;
next();
});
})
.use(function (req, res) {
//I can use req.body now
//But the proxy request timeouts
proxy.web(req, res);
});
http.createServer(app).listen(3000);
答案 0 :(得分:6)
当读取流以检索请求正文时,在代理请求时不能再次发送它。
为此,http-proxy web()
方法有一个选项可以发送已经缓冲的请求。
在第一个中间件上,使用包含您检索的主体的缓冲区构造一个PassThrough
流。例如,将它存储在请求中(可能有更好的方法来存储它),供以后使用。
var stream = require('stream');
req.on('end', function() {
req.body = buffer;
var bufferStream = new stream.PassThrough();
bufferStream.end(new Buffer(buffer));
req.bodyStream = bufferStream;
next();
});
然后在proxy.web()
属性的buffer
调用的第三个参数上添加它。
proxy.web(req, res, {buffer: req.bodyStream});