我正在使用Express 4,我正在使用中间件http-proxy-middleware
(https://github.com/chimurai/http-proxy-middleware),并且遇到以下问题
通常情况下,我可以在返回客户端之前执行以下操作来操作响应
app.get('/v1/users/:username', function(request, response, next) {
var username = request.params.username;
findUserByUsername(username, function(error, user) {
if (error) return next(error);
return response.render('user', user);
});
});
但是,如果我使用代理,如何执行自定义逻辑,假设我想在响应客户端之前操纵一些数据?使用这个中间件有一个很好的模式吗?
app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
这是我在github中放入的问题的反向链接 - https://github.com/chimurai/http-proxy-middleware/issues/97
任何帮助,将不胜感激。
根据http-proxy的官方文档,我认为这是正确的方法。 modify -response
app.use('/api', proxy({
target: 'http://www.example.org',
changeOrigin: true,
selfHandleResponse: true, // so that the onProxyRes takes care of sending the response
onProxyRes: function(proxyRes, req, res) {
var body = new Buffer('');
proxyRes.on('data', function(data) {
body = Buffer.concat([body, data]);
});
proxyRes.on('end', function() {
body = body.toString();
console.log("res from proxied server:", body);
res.end("my response to cli");
});
}
}));
这是我的答案,
onProxyRes :function(proxyRes, req, res){
var _write = res.write;
var output;
var body = "";
proxyRes.on('data', function(data) {
data = data.toString('utf-8');
body += data;
});
res.write = function (data) {
try{
/*** something detect if data is all download.my data is json,so I can do by this***/
eval("output="+body)
output = mock.mock(output)
_write.call(res,JSON.stringify(output));
} catch (err) {}
}
}
在http-proxy-middleware上添加onProxyRes选项使用proxyRes上的数据事件来获取输出然后修改res.write中的输出