如何在 http-proxy-middleware 函数内的 NodeJS 中发出阻塞请求?
How to make a bocking Request in NodeJS inside a http-proxy-middleware function?
我有一个代理服务器,它在将请求转发到服务器之前修改特定类型的 POST 请求。
修改要求我向另一台服务器发出请求,以获取将取代 POST 请求中旧值的新值。
在获得新值之前,我无法阻止 http-proxy-middleware
的 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', '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);
}
},
};
我有一个代理服务器,它在将请求转发到服务器之前修改特定类型的 POST 请求。
修改要求我向另一台服务器发出请求,以获取将取代 POST 请求中旧值的新值。
在获得新值之前,我无法阻止 http-proxy-middleware
的 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', '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);
}
},
};