节点http-proxy / http-proxy-middleware - 如何操作代理响应

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

我正在使用Express 4,我正在使用中间件http-proxy-middlewarehttps://github.com/chimurai/http-proxy-middleware),并且遇到以下问题

通常情况下,我可以在返回客户端之前执行以下操作来操作响应

app.get('/v1/users/:username', function(request, response, next) {
    var username = request.params.username;
    findUserByUsername(username, function(error, user) {
        if (error) return next(error);
        return response.render('user', user);
    });
});

但是,如果我使用代理,如何执行自定义逻辑,假设我想在响应客户端之前操纵一些数据?使用这个中间件有一个很好的模式吗?

app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));

这是我在github中放入的问题的反向链接 - https://github.com/chimurai/http-proxy-middleware/issues/97

任何帮助,将不胜感激。

node.js proxy http-proxy node-http-proxy
2个回答
1
投票

根据http-proxy的官方文档,我认为这是正确的方法。 modify -response

app.use('/api', proxy({
    target: 'http://www.example.org',
    changeOrigin: true,
    selfHandleResponse: true, // so that the onProxyRes takes care of sending the response
    onProxyRes: function(proxyRes, req, res) {
        var body = new Buffer('');
        proxyRes.on('data', function(data) {
            body = Buffer.concat([body, data]);
        });
        proxyRes.on('end', function() {
            body = body.toString();
            console.log("res from proxied server:", body);
            res.end("my response to cli");
        });
    }
}));

0
投票

这是我的答案,

onProxyRes :function(proxyRes, req, res){
      var _write = res.write;
      var output;
      var body = "";
      proxyRes.on('data', function(data) {
          data = data.toString('utf-8');
          body += data;
      });
      res.write = function (data) {
        try{
/*** something detect if data is all download.my data is json,so I can do by this***/
          eval("output="+body)
          output = mock.mock(output)
          _write.call(res,JSON.stringify(output));
        } catch (err) {}
      }
    }

在http-proxy-middleware上添加onProxyRes选项使用proxyRes上的数据事件来获取输出然后修改res.write中的输出

© www.soinside.com 2019 - 2024. All rights reserved.