我正在使用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
,如果它需要去其他地方,或者我们需要以不同的方式解决这个问题,我会很乐意听。
答案 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);