7

我正在尝试使用 Node JS 编写 API 服务的前端。

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

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

node.js / express中的代理请求

我看到如何修改请求的输入,但我不知道如何修改响应。有什么建议么?

4

4 回答 4

5

变压器代理在这里可能很有用。我是这个插件的作者,我在这里回答是因为我在寻找同样的问题时发现了这个页面并且对和谐不满意,因为我不想操纵 HTML。

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

于 2014-08-24T11:55:36.597 回答
4

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

这可用于修改输出响应。

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

于 2013-03-14T10:31:56.623 回答
0

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

于 2018-10-10T19:40:47.513 回答
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;
   });
});
于 2020-01-12T09:21:57.277 回答