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

How to make a bocking Request in NodeJS inside a http-proxy-middleware function?

我有一个代理服务器,它在将请求转发到服务器之前修改特定类型的 POST 请求。

修改要求我向另一台服务器发出请求,以获取将取代 POST 请求中旧值的新值。

在获得新值之前,我无法阻止 http-proxy-middlewareonProxyReq 函数。

任何事情都会有所帮助。谢谢

代码:

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', 'application/json');
            proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
            proxyReq.write(bodyData);
        }
    },
};

app.use(createProxyMiddleware(options));

问题是 POST 请求在可以从 request.post 操作接收到新值之前被转发。

我认为这可以通过在 proxy-middleware 之前使用另一个中间件来解决。在这个额外的 middleware-handler 中,您可以检查是否发出外部请求并将新的 url 分配给 req.body。然后,在 onProxyReq 中,您只需检查 req.body 是否已更改,并在这种情况下重新计算 content-length。类似的东西(注意我正在使用 superagent,因为 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));

然后在您的 proxy-config 中您可以:

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);
        }
    },
};