如何使用microapps Node.js模块处理Shopify的API调用限制

我一直在敲我的头,find一个答案,我只是不知道。 我正在使用microapps的Shopify API的Node.js模块。 我有一个JSON对象,包含产品ID和Skus的列表,我需要更新,所以我循环通过该文件,并调用一个函数,调用API。 Shopify的API限制对它的调用并发送一个剩余值的响应头。 这个节点模块提供了一个包含限制和用法的对象。 我的问题是基于下面的代码如何在setTimeout或类似的时候达到极限。 一旦你第一次打电话,它会返回这样的限制对象:

{ remaining: 30, current: 10, max: 40 } 

这是我没有尊重的限制,因为我试过的一切都失败了:

 const products = JSON.parse(fs.readFileSync('./skus.json','utf8')); for(var i = 0;i < products.length; i++) { updateProduct(products[i]); } function updateProduct(product){ shopify.productVariant.update(variant.id, { sku: variant.sku }) .then(result => cb(shopify.callLimits.remaining)) .catch(err => console.error(err.statusMessage)); } 

我知道我需要实现某种callback来检查剩余使用率是否低,然后等待几秒钟再次调用。 任何帮助将不胜感激。

我会用一些东西来限制shopify-api-nodeShopify.prototype.request )使用的函数的执行速度来创build请求,例如https://github.com/lpinca/valvelet

下面的代码没有testing,但应该工作。 它应该尊重每秒2个呼叫的限制。

 var Shopify = require('shopify-api-node'); var valvelet = require('valvelet'); var products = require('./skus'); var shopify = new Shopify({ shopName: 'your-shop-name', apiKey: 'your-api-key', password: 'your-app-password' }); // Prevent the private shopify.request method from being called more than twice per second. shopify.request = valvelet(shopify.request, 2, 1000); var promises = products.map(function (product) { return shopify.productVariant.update(product.id, { sku: product.sku }); }); Promise.all(promises).then(function (values) { // Do something with the responses. }).catch(function (err) { console.error(err.stack); }); 

如果您看Shopify代码,他们的github存储库有一个CLI。 CLI正在处理这个限制。 您可以快速了解Shopify如何处理这些限制,查看其代码。

由于他们的代码是在Ruby中,所以很容易消化。 它不应该让一个熟练的JS程序员花几分钟时间来看看如何处理基于这个代码的限制,甚至从Ruby中抽象出来。

所以我的build议是阅读Shopify代码,然后尝试,然后变形您的JS代码以匹配相同的模式。