问题描述
我有一个代理服务器,可以在将特定类型的POST请求转发到服务器之前对其进行修改。
修改要求我向另一台服务器发出请求,以便获得新值,该新值将代替POST请求中的旧值。
在获得新值之前,我无法阻止http-proxy-middleware
的{{1}}函数。
任何事情都会有所帮助。谢谢。
代码:
onProxyReq
问题是在可以从const options = {
target: 'http://localhost:8998',changeOrigin: true,onProxyReq: (proxyReq,req,res) => {
if (req.path === '/batches' && req.body && req.body.file) {
request.post('MAKES REQUEST TO ANOTHER SERVER FOR NEW VALUE',{json: {}},(error,res,body)=>{
req.body.url=body.url;
});
const bodyData = JSON.stringify(req.body);
proxyReq.setHeader('Content-Type','application/json');
proxyReq.setHeader('Content-Length',Buffer.byteLength(bodyData));
proxyReq.write(bodyData);
}else{
const bodyData = JSON.stringify(req.body);
proxyReq.setHeader('Content-Type',Buffer.byteLength(bodyData));
proxyReq.write(bodyData);
}
},};
app.use(createProxyMiddleware(options));
操作接收新值之前转发POST请求。
解决方法
我认为可以通过在代理中间件之前使用其他中间件来解决。在这个附加的中间件处理程序中,您可以检查是否发出外部请求,并将新的url
分配给req.body
。然后,在onProxyReq
中,您只需检查req.body是否已更改,然后重新计算内容长度。类似的东西(请注意,我不赞成使用request作为超级代理):
const superagent = require('superagent');
app.use('/batches',async (req,res,next) => {
if(req.body && req.body.file) {
const resp = await superagent('http://your-other-host');
req.body.url = resp.body.url;
}
next();
});
app.use(createProxyMiddleware(options));
然后在您的代理配置中可以执行以下操作:
const options = {
target: 'http://localhost:8998',changeOrigin: true,onProxyReq: (proxyReq,req,res) => {
if (req.path === '/batches' && req.body && req.body.file) {
const bodyData = JSON.stringify(req.body);
proxyReq.setHeader('Content-Type','application/json');
proxyReq.setHeader('Content-Length',Buffer.byteLength(bodyData));
proxyReq.write(bodyData);
}
},};