Как остаться в пределах 2 запросов GET / сек в секунду с Ax ios (Shopify API) - PullRequest
0 голосов
/ 28 апреля 2020

У меня около 650 товаров, и у каждого товара есть много дополнительной информации, связанной с ним, которая хранится в метаполях. Мне нужно, чтобы вся информация метаполя была сохранена в массиве, чтобы я мог фильтровать определенные биты информации и отображать их пользователю.

Чтобы получить все метафайловые данные, вам нужно сделать один вызов API для каждого продукта с использованием идентификатора продукта, например, так: /admin/products/#productid#/metafields.json
Итак, я получил все идентификаторы продуктов и запустил их. a 'for in l oop' и звонил по одному за раз. Проблема в том, что я сталкиваюсь с «ошибкой 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))
    })

1 Ответ

2 голосов
/ 28 апреля 2020

Когда вы нажмете 429 об ошибке, проверьте заголовок Retry-After и дождитесь указанного там количества секунд.

Вы также можете использовать заголовок X-Shopify-Shop-Api-Call-Limit в каждом ответе, чтобы понять, сколько запросов осталось до вас. превышение предела размера корзины.

Подробнее см. здесь: Ограничения скорости REST Admin API * Кстати, вы используете пагинацию на основе страниц, которая устарела и скоро станет недоступной.

Используйте взамен пагинацию на основе курсора .

...