如何将一个POST请求转发到两个外部URL?

我们使用的一个SaaS提供商有一个webook字段,但只允许input一个url。 事实上,我们需要将这个webhook发送到两个分析服务,所以我需要找出一个方法来编写一个自定义端点,将整个请求转发到我们需要的其他端点(目前为2个)。

用node和express做这个最简单的方法是什么? 如果我没有弄错,简单的redirect不适用于多个POST,对吧?

我不确定头文件甚至是请求内容是什么样子的,但是如果auth在头文件中,它需要尽可能地保留。

这是我迄今为止,但它是远远不够完整:

app.post('/', (req, res) => { console.log('Request received: ', req.originalUrl) const forwardRequests = config.forwardTo.map(url => { return new Promise((resolve, reject) => { superagent .post(url) .send(req) .end((endpointError, endpointResponse) => { if (endpointError) { console.error(`Received error from forwardTo endpoint (${url}): `, endpointError) reject(endpointError) } else { resolve(endpointResponse) } }) }) }) Promise.all(forwardRequests) .then(() => res.sendStatus(200)) .catch(() => res.sendStatus(500)) }) 

我得到一个错误,因为superagent.send只是为内容…我怎么能完全复制一个请求,并把它发送

完全复制请求并将其发送到各个端点,可以使用带有req.pipe(request(<url>))Promise.all的请求模块。

根据要求模块的文件:

你也可以通过http.ServerRequest实例pipe道(),以及http.ServerResponse实例。 HTTP方法,头文件和实体主体数据将被发送。

这里是一个例子:

 const { Writable } = require('stream'); const forwardToURLs = ['http://...','http://...']; app.post('/test', function(req, res) { let forwardPromiseArray = []; for (let url of forwardToURLs) { let data = ''; let stream = new Writable({ write: function(chunk, encoding, next) { data += chunk; next(); } }); let promise = new Promise(function(resolve, reject) { stream.on('finish', function() { resolve(data); }); stream.on('error', function(e) { reject(e); }); }); forwardPromiseArray.push(promise); req.pipe(request(url)).pipe(stream); } Promise.all(forwardPromiseArray).then(function(result) { // result from various endpoint, you can process it and return a user-friendly result. res.json(result); }).catch(function() { res.sendStatus(500); }); }); 

请注意上面的代码应该放在body-parser之前(如果你正在使用它的话)。 否则,请求将不被传送。