【问题标题】:Node http-proxy / http-proxy-middleware - How do you manipulate proxy response节点 http-proxy / http-proxy-middleware - 你如何操作代理响应
【发布时间】:2016-08-06 16:11:56
【问题描述】:

我正在使用 Express 4,并且正在使用中间件 http-proxy-middleware (https://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


【解决方案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");
        });
    }
}));

【讨论】:

    【解决方案2】:

    这是我的答案,

    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 上的 data 事件来获取输出 然后在res.write中修改输出

    【讨论】:

    • 这不是很hacky吗?您正在重新定义 res 对象的 write 方法?
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多