使用http-proxy-middleware包进行自定义响应

时间:2019-01-02 11:16:45

标签: javascript node.js

在我们的项目中,我们使用“ http-proxy-middleware”(https://www.npmjs.com/package/http-proxy-middleware)npm软件包进行代理。

有用于订阅http-proxy事件的“ onProxyRes”功能。

还有该功能的示例:

function onProxyRes(proxyRes, req, res) {
  proxyRes.headers['x-added'] = 'foobar' // add new header to response
  delete proxyRes.headers['x-removed'] // remove header from response
}

我只是很有趣,是否有可能基于proxyRes在 res 对象中写入更改的响应,并且不直接从 proxyRes 对象复制数据?

只是一个例子:

proxyRes(可读流包含以下数据:{“ url”:“ http://domain/test”},我想修改该响应并使用以下数据进行解析:{{“ url”:“ { {3}}“}},不要直接从proxyRes复制数据

2 个答案:

答案 0 :(得分:0)

我认为没有必要将数据复制到res,因为proxyRes已经拥有changedDomain。 这是我实现的设置:

const express = require('express');
const httpProxy = require('http-proxy-middleware');

const app = express();

app.use('/api', httpProxy({ target : 'sometarget.com', changeOrigin : true, onProxyRes})

function onProxyRes (proxyResponse, request, response) {
  console.log('proxyResponse', proxyResponse.headers);  
  console.log('response', response.headers);
}

// Results
/*
proxyResponse { date: 'Wed, 02 Jan 2019 12:06:40 GMT',
  server: 'Apache',
  location: 'http://sometarget.com/api',
  'cache-control': 'max-age=30',
  expires: 'Wed, 02 Jan 2019 12:07:10 GMT',
  'content-length': '231',
  connection: 'close',
  'content-type': 'text/html; charset=iso-8859-1' }
response undefined
*/

您需要的一切都在proxyRes中,除非您有response的特定用途...

答案 1 :(得分:0)

也许看起来有点丑陋,但是我可以使用以下代码进行管理:

function onProxyRes(proxyResponse, request, serverResponse) {
  var body = "";
  var _write = serverResponse.write;
  proxyResponse.on('data', function (chunk) {
    body += chunk;
  });

  serverResponse.write = function (data) {
    try{
      var jsonData = JSON.parse(data);
      // here we can modify jsonData
      var buf = Buffer.from(JSON.stringify(jsonData), 'utf-8');
      _write.call(serverResponse,buf);
    } catch (err) {
      console.log(err);
    }
  }

}