如何使用express-http-proxy修改响应头

时间:2017-01-18 21:53:28

标签: javascript node.js express http-headers http-proxy

背景

我正在使用express-http-proxy代理我的SPA(单页面应用程序)和CouchDB实例之间的一些请求。我是在每次通话的基础上做这个代理,而不是创建代理服务器(这一点很重要)。

当前使用的例子

app.use(`some/url`, proxy(dburl, {
  forwardPath: req => {return 'some/url'+require('url').parse(req.url).path;}
 }) );

这意味着我没有使用httpProxy.createServer。我想发送一些文本数据片段以及我的回复作为标题。在查看documentation之后,我得出结论,我想要的是使用intercept。遗憾的是,我还没有完全掌握如何使用它,到目前为止我发现的only related questions似乎基于出现的httpProxy.createServer(从我有限的理解)以不同的方式工作。

我们正在使用单独的请求代理,因为我们希望将不同的请求代理到不同的微服务,并且发现这是最简洁的方式(我们当时知道并且当时)。

问题

给出代码

const text = 'asdf';
app.use(`some/url`, proxy(dburl, {
  forwardPath: req => {return 'some/url'+require('url').parse(req.url).path;},
  intercept: function(rsp, data, req, res, callback) {
    //SUSPECT LOCATION
  }
}) );

SUSPECT LOCATION是否有一些代码允许我在最终响应的标题上放置text而不会对(当前正在运行的)代理产生进一步影响?

附加说明

一般来说,标题和网络请求对我来说并不是很熟悉,如果答案看起来不言自明,我很抱歉。

指向资源链接的奖励点,有助于解释使用此库进行代理的更精细点,类似的代理库,或者可以明确如何使用此库进行代理的基础技术。 AKA我宁愿花一些时间来深入研究这个问题,也不要再回答其他问题了。

我并不完全相信我的代码的位置会SUSPECT LOCATION,如果它需要去其他地方,或者我们需要以不同的方式解决这个问题,我会很乐意听。

2 个答案:

答案 0 :(得分:2)

它遵循req,res对象的express.js方法。

在拦截函数体内,使用以下明确格式设置响应头。

res.set('hola', 'amigos!!!');

参考以下链接:
http://expressjs.com/en/4x/api.html#res.set

在没有文档的情况下理解库的最佳方法是遵循其测试套件。如果没有测试套件,请不要使用该库。

这是express-http-proxy拦截功能的测试套件
https://github.com/villadora/express-http-proxy/blob/master/test/intercept.js

这是测试用例

it('can modify the response headers', function(done) {
  var app = express();
  app.use(proxy('httpbin.org', {
    intercept: function(rsp, data, req, res, cb) {
      res.set('x-wombat-alliance', 'mammels');
      res.set('content-type', 'wiki/wiki');
      cb(null, data);
    }
  }));

  request(app)
  .get('/ip')
  .end(function(err, res) {
    if (err) { return done(err); }
    assert(res.headers['content-type'] === 'wiki/wiki');
    assert(res.headers['x-wombat-alliance'] === 'mammels');
    done();
  });
});

如果您想要在代理中退出或退出代理,最好的资源是haproxy
http://cbonte.github.io/haproxy-dconv/1.7/intro.html

但在此之前,你需要更多地理解http(一个有建设性的评论)

答案 1 :(得分:0)

现在接受的答案已过时。 拦截不再存在。

相反,在代理功能之前使用您自己的中间件

router.route('/my-route').get((req, res, next) => {
  res.set('My-Header', 'my-header-value');
  next();
}, proxyFunction);