如何限制/设置限制请求以防止Axios发生429错误

问题描述 投票:0回答:1

我正在尝试使用对讲API来关闭符合特定条件的一系列对话。我正在使用Axios来首先调用其API以获取会话ID的数组,然后遍历这些ID并调用其API以将其关闭。根据他们的文档,它们受到以下限制:

尽管允许的请求限制持续1分钟,但我们将其平均分配到10秒的窗口中。这意味着每10秒重置一次允许的请求数量。例如,默认的速率限制为每分钟1000个,表示您每10秒内最多可以发送166个操作(1000/6)

我尝试使用P-Limit,但在最终获得429之前确实允许更多成功的请求。是否有一个好的解决方案来限制请求以使其符合其文档中设置的标准?

到目前为止,这是我使用PLimit进行的尝试-为了简洁起见,我省略了第一个诺言的代码块:

const listOfConversations = [];

        axios
          .post(searchUrl, searchBodyParameters, config)
          .then((response) => {...
    .then(() => {
            const promises = [];
            listOfConversations.forEach((conversation) => {
              const p = axios
                .post(
                  `https://api.intercom.io/conversations/${conversation}/parts`,
                  closeBodyParameters,
                  config,
                )
                .catch((error) => {
                  console.log(
                    `Error. Failed to close conversations. Server Returned - ${error.response.status}`,
                  );
                });
              promises.push(limit(() => p));
            });
          })
          .catch((error) => {
            console.log(
              `Error. Failed to get number of pages. Server Returned - ${error.response.status}`,
            );
          });
node.js axios rate-limiting intercom
1个回答
0
投票

我在另一个线程上找到了完美的解决方案,在该线程上,用户使用设置的超时发布了一个非常好的解决方案。我在这里应用它:

const listOfConversations = [];

        axios
          .post(searchUrl, searchBodyParameters, config)
          .then((response) => {...
    .then(() => {
        const interval = 70;
        let promise = Promise.resolve();
        listOfConversations.forEach((conversation) => {
        promise = promise.then(() => {
          axios.post(
            `https://api.intercom.io/conversations/${conversation}/parts`,
            closeBodyParameters,
            config,
          )
          .catch((error) => {
            console.log(
              `Error. Failed to close conversations. Server Returned - ${error.response.status}`,
            );
          })
          return new Promise((resolve) => {
            setTimeout(resolve, interval);
          })
        })
        });
      })
      .catch((error) => {
        console.log(
          `Error. Failed to get number of pages. Server Returned - ${error.response.status}`,
        );
      });
    }

可以找到原始发布的解决方案here

© www.soinside.com 2019 - 2024. All rights reserved.