首页 > 解决方案 > 返回多个异步响应

问题描述

我目前正在寻找一个接受请求的端点,并在加载时以增量方式返回响应数据。

它的应用是给定一次数据上传,我想为该数据计算许多不同的指标。由于每个指标都是异步计算的,我想将此指标的值返回到前端进行渲染。

为了测试,我的控制器如下所示,尝试使用 res.write

uploadData = (req, res) => {
   res.write("test");
   setTimeout(() => {
       res.write("test 2");
       res.end();
   }, 3000);
}

但是,我认为问题源于我在 React-Redux 中编写的客户端,并通过 Axios 调用调用了该路由。据我了解,这是因为 axios 请求在收到第一个响应后关闭,并且连接不会保持打开状态。这是我的 axios 调用的样子:

axios.post('/api', data)
  .then((response) => {
      console.log(response);
  })
  .catch((error) => {
       console.log(error);
  });

是否有捷径可寻?我也考虑过流式传输,但是我对流式传输的担忧是,我希望每个连接在短时间内打开的客户端之间都是直接且唯一的(即仅在计算指标时打开)。

我还应该提到,正在上传的资源是一个数据库,我想避免由于多个端点而多次解析和打开连接。

在此先感谢,如果我能提供更多上下文,请告诉我

标签: node.jsexpressconnectionhttprequestaxios

解决方案


在仍然使用传统 API 的同时处理此问题的一种方法是将指标存储在某个对象中,例如数据库或 redis,然后只需长轮询资源。

对于现实世界的示例,假设您要计算 foo、完成时间、请求长度、bar、foobar 的以下指标。

您可以在存储中创建一个如下所示的对象:

{
  id: 1,
  lengthOfRequest: 123,
 .....
}

然后您将在您的 API 中创建一个类似的端点metrics/{id} 并返回该对象。只需继续调用路线,直到一切完成。

当然,这有一些明显的缺点,但是一旦您获得足够的信息以了解指标平均需要多长时间才能完成,您可以调整调用 API 之间的时间。


推荐阅读