javascript - 如何将一个 POST 请求转发到两个外部 url?

标签 javascript node.js http express ecmascript-6

我们使用的一个 SaaS 提供商有一个 webbook 字段,但只允许输入一个 url。事实上,我们需要将此 webhook 发送到两个分析服务,因此我需要想出一种方法来编写一个自定义端点,将整个请求转发到我们需要的任意多个其他端点(目前为 2 个)。

使用 node 和 express 执行此操作的最简单方法是什么?如果我没记错的话,一个简单的重定向不会对多个 POST 起作用,对吧?

我不确定 header 甚至请求内容会是什么样子,但需要尽可能多地保留它,以防在 header 等中出现 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 只是为了内容...我如何完全复制一个请求并将其发送

最佳答案

完全复制一个请求并将其发送到不同的端点,您可以使用request模块与 req.pipe(request(<url>))Promise.all .

根据请求模块的文档:

You can also pipe() from http.ServerRequest instances, as well as to http.ServerResponse instances. The HTTP method, headers, and entity-body data will be sent.

这是一个例子:

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之前(如果您正在使用它)。否则,将不会通过管道传输请求。

关于javascript - 如何将一个 POST 请求转发到两个外部 url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45911358/

相关文章:

javascript - '_' 中的意外悬挂 '_gaq'

javascript - 如何隐藏底部的CSS

javascript - jQuery:即使复选框被选中也会触发

javascript - 是否可以将全局范围注入(inject)到 ES6 中的实例化类中,也就是单例?

node.js - python安装mern时出错

http - groovy 上传 jar 到 nexus

javascript - 咕噜声 : Watch and synchronize files

mysql - 更改 Sequelize 的 Distinct 的别名

http - 304 和 200 的区别(来自磁盘缓存)

api - 如何仅使用 dart 代码解决 flutter web api cors 错误?