使用Node JS代理http并修改响应

时间:2012-11-28 02:45:57

标签: api node.js http-proxy

我正在尝试用Node JS编写一个API服务的前端(我是一个相对初学者)。

我希望能够让用户将他们的浏览器指向我的节点服务器并发出请求。节点脚本将修改请求的输入,调用api服务,然后修改输出并传回给用户。

我喜欢这里的解决方案(使用Express JS和node-http-proxy),因为它将cookie和标头直接从用户通过我的站点传递到api服务器。

proxy request in node.js / express

我看到如何修改请求的输入,但我无法弄清楚如何修改响应。有什么建议吗?

4 个答案:

答案 0 :(得分:5)

transformer-proxy在这里很有用。我是这个插件的作者,我在这里回答是因为我在查找同一个问题时发现了这个页面,并且因为我不想操纵HTML而对和声感到满意。

也许其他人正在寻找这个并发现它很有用。

答案 1 :(得分:4)

Harmon旨在插入node-http-proxy https://github.com/No9/harmon 它使用小号,因此基于流来解决任何缓冲问题。 它使用元素和属性选择器来启用响应操作。

这可以用来修改输出响应。

见这里:https://github.com/nodejitsu/node-http-proxy/issues/382#issuecomment-14895039

答案 2 :(得分:0)

http-proxy-interceptor是我为此目的编写的中间件。它允许您使用一个或多个转换流来修改http响应。有大量基于流的包(例如和声使用的小号),通过使用流,可以避免缓冲整个响应。

答案 3 :(得分:0)

var httpProxy = require('http-proxy');
var modifyResponse = require('http-proxy-response-rewrite'); 
var proxy = httpProxy.createServer({
      target:'target server IP here',
        });
  proxy.listen(8001);
  proxy.on('error', function (err, req, res) {
  res.writeHead(500, {
  'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.');
 });

proxy.on('proxyRes', function (proxyRes, req, res) {

modifyResponse(res, proxyRes.headers['content-encoding'], function (body) {
    if (body && (body.indexOf("<process-order-response>")!= -1)) {
        var beforeTag = "</receipt-text>"; //tag after which u can add data to 
                                                              //       response
        var beforeTagBody = body.substring(0,(body.indexOf(beforeTag) + beforeTag.length));
              var requiredXml = " <ga-loyalty-rewards>\n"+
                                 "<previousBalance>0</previousBalance>\n"+
                                 "<availableBalance>0</availableBalance>\n"+
                                 "<accuruedAmount>0</accuruedAmount>\n"+
                                 "<redeemedAmount>0</redeemedAmount>\n"+                                   
                                 "</ga-loyalty-rewards>";
     var afterTagBody = body.substring(body.indexOf(beforeTag)+  beforeTag.length)+
     var res = [];
     res.push(beforeTagBody, requiredXml, afterTagBody);    
     console.log(res.join(""));
     return res.join("");
    }
    return body;
   });
});