如何在代理之前检索 POST 请求正文
How to retrieve POST request body before proxying it
使用 connect library on Node, I tried to retrieve request body before proxying it with 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);
由于读取流是为了获取请求体,代理请求时不能二次发送。
为此,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});
使用 connect library on Node, I tried to retrieve request body before proxying it with 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);
由于读取流是为了获取请求体,代理请求时不能二次发送。
为此,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});