0

我有大约 650 个产品,每个产品都有很多与它相关的附加信息存储在元字段中。我需要将所有元字段信息存储在一个数组中,这样我就可以过滤某些信息并将其显示给用户。

为了获取所有元文件数据,您需要使用产品 ID 对每个产品进行一次 API 调用,如下所示:/admin/products/#productid#/metafields.json
所以我所做的是获取所有产品 ID,然后运行“for in loop”并在时间。问题是我遇到了“429 错误”,因为我最终每秒发出超过 2 个请求。有没有办法像某种排队系统一样解决这个问题?

 
    let products = []

    let requestOne = `/admin/products.json?page=1&limit=250`
    let requestTwo = `/admin/products.json?page=2&limit=250`
    let requestThree = `/admin/products.json?page=3&limit=250`

    // let allProducts will return an array with all products
    let allProducts

    let allMetaFields = []
    let merge
    $(document).ready(function () {
      axios
        .all([
          axios.get(`${requestOne}`),
          axios.get(`${requestTwo}`),
          axios.get(`${requestThree}`),
        ])
        .then(
          axios.spread((firstResponse, secondResponse, thirdResponse) => {
            products.push(
              firstResponse.data.products,
              secondResponse.data.products,
              thirdResponse.data.products
            )
          })
        )
        .then(() => {
          // all 3 responses into one array
          allProducts = [].concat.apply([], products)
        })
        .then(function () {
          for (const element in allProducts) {
            axios
              .get(
                `/admin/products/${allProducts[element].id}/metafields.json`
              )
              .then(function (response) {
                let metafieldsResponse = response.data.metafields
                allMetaFields.push(metafieldsResponse)
              })
          }
        })
        .then(function () {
          console.log("allProducts: " + allProducts)
          console.log("allProducts: " + allMetaFields)
        })
        .catch((error) => console.log(error))
    })

4

1 回答 1

2

当您遇到 429 错误时,请检查Retry-After标头并等待此处指定的秒数。

您还可以X-Shopify-Shop-Api-Call-Limit在每个响应中使用标头来了解在超出存储桶大小限制之前还剩下多少请求。

在此处查看更多详细信息:REST Admin API 速率限制


顺便说一句,您正在使用基于页面的分页,该分页已被弃用,很快将变得不可用。

请改用基于光标的分页

于 2020-04-28T10:39:47.797 回答