如何在代理之前检索POST请求正文

时间:2016-01-25 13:47:56

标签: node.js connect node-http-proxy

在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);

1 个答案:

答案 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});