Shopify API - Получить все продукты (60 тыс. Продуктов) Время ожидания запроса или зависание сокета - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь получить все продукты, но у меня истекло время ожидания запроса при попытке получить 60 тыс. Продуктов для приложения управления запасами.

Я использую nodejs для циклического просмотра 200 страниц, каждая страница ограничена 250 продуктами,Я ограничил 2 запроса каждые 10 секунд для моих вызовов (5 секунд / 1 запрос)

иногда я получал эти ошибки на нескольких страницах.Иногда нет

  • читать ECONNRESET

  • Время ожидания истекло

  • зависание сокета

Может кто-нибудь сказать, пожалуйста, в чем проблема?Буду признателен за вашу помощь.

for (var i = 1; i<= totalPage;i++)

{

  var promise = shopify.product.list({limit:limit,page:i,fields:fields})

  .then(products =>{

  // do some thing here when got products list
    // loop through each product then save to DB
    // ShopifyModel.updateOne(.....)

  }).catch(error=>{

  // some time it fired error here 

  })

}
Я также пытался переписать функцию для получения продуктов на 1 странице:

const request = require('request-promise');

var getProductOnePage = function (Url_Page,headers,cb){
    request.get(productUrl, { headers: headers,gzip:true })
    .then((ListProducts) => {
        console.log(" Got products list of one page");
        cb(ListProducts);
    })
    .catch(err=>{
        // Got All Error Here when try to put into for loop or map or forEach with promise.all
        console.log("Error Cant get product of 1 page: ",err.message);
    });
}

РЕДАКТИРОВАТЬ: Я нашел некоторые проблемы, похожие на мой случай здесь: https://github.com/request/request/issues/2047 https://github.com/twilio/twilio-node/issues/312

Ответы [ 2 ]

0 голосов
/ 13 октября 2018
Ошибки
  • ECONNRESET и Request timed out возникают в основном из-за проблем с сетью.Убедитесь, что у вас стабильное интернет-соединение.

  • Если вы используете shopify api node package, используйте свойство autoLimit.Он позаботится об ограничении скорости.

Например:

const shopify = new Shopify({
    shopName: shopName,
    apiKey: api_key,
    password: password,
    autoLimit : { calls: 2, interval: 1000, bucketSize: 30 }
});

Редактировать : вместо записи, затем перехватывать внутри цикла for, используйтеасинхронное ожиданиеПоскольку вы реализуете запрос и ждете подход или нет, цикл будет отправлять все запросы.Но если вы используете await, он будет обрабатывать один запрос за раз.

let getProducts = async () => {
    for (var i = 1; i<= totalPage;i++)
    {
        try {
            let products = await shopify.product.list({limit:limit,page:i,fields:fields});
            if(!products.length) {
                // all products have been fetched
                break;
            }
            // do you stuffs here
        } catch (error) {
            console.log(error);
        }
    }
}   
0 голосов
/ 13 октября 2018

Вы должны понимать концепцию ограничения скорости.С любым общедоступным API, таким как Shopify, вы можете совершать столько звонков, пока они не задержат вас.Поэтому, когда вы получаете ответ от Shopify, вы можете проверить, сколько запросов вы можете сделать в заголовке.Если он равен нулю, вы получите 429, если попытаетесь сделать запрос.

Поэтому, когда вы получаете 0 за кредиты или 429 обратно, вы можете установить себе небольшой тайм-аут и ждать следующего звонка.

Если, с другой стороны, как вы говорите, вы делаете только 2 вызова каждые 10 секунд (не совсем понятно из вашего кода, как вы это делаете и почему ??) и вы получаете тайм-ауты,тогда ваше интернет-соединение с Shopify, вероятно, является проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...