如何在代理之前检索 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});