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

问题描述 投票:2回答:1

在Node上使用connect库,我尝试在使用node-http-proxy代理它之前检索请求体。

从Node v4开始,我们必须使用bodyParser之类的中间件(或者只是请求数据/结束事件)来检索POST请求体。

问题是,它似乎消耗了请求流,并且在被代理时请求超时。

这是代码,首先我用数据事件检索正文,然后我将它提供给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);
node.js connect node-http-proxy
1个回答
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});
© www.soinside.com 2019 - 2024. All rights reserved.