如何在http-proxy-middleware函数内的NodeJS中发出终止请求?

问题描述

我有一个代理服务器,可以在将特定类型的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);
        }
    },};