#javascript #stripe-payments
Вопрос:
Я пытаюсь разработать бэкэнд веб-сайта электронной коммерции, используя Stripe и NodeJS (точно выраженные).
Когда сервер запускается, я пытаюсь получить свои продукты из Stripe. Но после первого stripe.products.list
звонка я получаю сообщение об ошибке, в котором говорится, что я превысил ограничение скорости api. Это неправда, потому что, как говорится в документе Stripe, скорость ограничена 25 в секунду в тестовом режиме, в то время как я жду 10 СЕКУНД, прежде чем сделать второй звонок.
Пожалуйста, найдите ниже функцию, которую я использую для совершения звонков. Я просто использую его в цикле с функцией sleep() перед каждым вызовом.
async function fetchFromLastObj(last_obj){
const data = stripe.products.list({
active: true,
limit: maxRetrieve,
starting_after: last_obj,
})
.then((resp) => {
console.log(`Retrieved ${resp.data.length} products.`);
return resp.data;
})
.catch((e) => { });
return data;
}
Функция сна:
const { promisify } = require('util')
const sleep = promisify(setTimeout)
Рассматриваемая петля:
var last_obj_seen = null;
var nb_iters = 0;
// fetching all products from stripe
while (true) {
console.log(`Iteration ${nb_iters 1}...`)
let fetchedList = [];
if (last_obj_seen == null) {
fetchedList = await fetchFirstBatch();
} else {
fetchedList = await fetchFromLastObj(last_obj_seen);
}
fetchedList = Array.from(fetchedList);
if (fetchedList.length == 0) { break; };
last_obj_seen = fetchedList.slice(-1)[0];
await sleep(10000);
fetchPrices((fetchedList))
.then((fetchedListWithPrices)=>{
saveList(fetchedListWithPrices);//not asynchronous
})
.catch((err) => { console.error("While fetching products from Stripe..."); console.error(err); });
nb_iters = 1;
if(nb_iters > 100){ throw Error("Infinite loop error"); }
if (nb_iters !== 0){
console.log("Waiting before request...");
await sleep(10000);
}
}
console.log("Done.");
Комментарии:
1. «петля» и «сон» звучат подозрительно. Как выглядит ваша
sleep()
функция и как вы ее используете …2. Я использовал два вида сна: первый-грязный цикл, который увеличивает переменную в 100000000 раз (что-то в этом роде, я не помню фактического числа), а второй-сон в виде обещания, которое я нашел в Интернете flaviocopes.com/javascript-sleep
3. пожалуйста, обновите qutestion с помощью кода, который вы используете в данный момент … Пожалуйста, добавьте и
sleep
функцию, и цикл, в котором вы ее используете …4. так что же
fetchPrices
делать? И я предполагаю, что этот цикл находится внутриasync
блока? Кстати, вы не должны смешивать цепочку обещаний (т. Е.then().catch()
сasync/await
5. Кроме того, ваш код всегда будет выбрасываться, потому что единственный способ выйти из него-это, если
nb_iters
попадет100
Ответ №1:
Вместо того, чтобы самостоятельно обрабатывать логику разбиения на страницы, вы можете использовать функцию автоматической разбиения на страницы официальных библиотек Stripe.
Наши библиотеки поддерживают автоматическую разбиение на страницы. Эта функция легко обрабатывает извлечение больших списков ресурсов без необходимости вручную разбивать результаты на страницы и выполнять последующие запросы.
В узле 10 вы можете сделать это, например:
for await (const product of stripe.products.list()) {
// Do something with product
}
Библиотека узлов Stripe будет обрабатывать разбиение на страницы под капотом для вас.