【问题标题】:How to retrieve POST request body before proxying it如何在代理之前检索 POST 请求正文
【发布时间】:2016-01-25 13:47:56
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    由于读取流是为了获取请求体,代理请求时不能再次发送。

    为此,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});
    

    【讨论】:

    • 我看到很多类似问题的类似答案,这是最好的!我发现的其余答案说要么不使用正文解析,要么在使用之前代理请求。这克服了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多