【问题标题】:How to query or export ALL Shopify customers or orders with rate limiting如何查询或导出所有 Shopify 客户或具有速率限制的订单
【发布时间】:2020-08-20 19:18:38
【问题描述】:
考虑到速率限制和分页因素,我很好奇如果我想将所有满足特定条件的客户或订单导出为 json 或 csv 等,那么最好的方法是什么。我猜这将是某种循环脚本,最多可以查询 250 条记录并重复该操作,直到分页完成。是否有任何代码可以显示这一点,我觉得有很多应用程序这将是有用的或需要做某些事情。这或多或少是 shopify 中的导出功能,但在您自己的应用中进行。
【问题讨论】:
标签:
shopify
shopify-app
shopify-api
shopify-api-node
【解决方案1】:
Shopify 有一个很好的 Node.js API 模块。它提供了简单的分页处理和速率限制。从应用程序的角度来看,您可能会决定使用一些队列机制。由于这些过程可能需要更长的时间才能完成,具体取决于订单或客户的数量,因此每当客户请求记录导出时,将作业推送到队列中并在完成后通知。
对于在处理速率限制的同时使用 API 获取订单或客户,Shopify API Node Docs 中的以下代码就足够了。
const Shopify = require("shopify-api-node");
const shopify = new Shopify({
shopName: "your-shop-name",
apiKey: "your-api-key",
password: "your-app-password",
autoLimit: true,
});
(async () => {
let params = { limit: 250 };
do {
const products = await shopify.product.list(params);
console.log(products);
params = products.nextPageParameters;
} while (params !== undefined);
})().catch(console.error);
autoLimit - 可选 - 此选项允许您调节请求
率以避免达到速率限制。请求是有限的
使用令牌桶算法。接受的值是布尔值或
纯 JavaScript 对象。使用对象时,调用属性和
间隔属性指定再填充率和bucketSize
属性桶大小。例如{调用:2,间隔:1000,
bucketSize: 35 } 指定每秒 2 个请求的限制
突发 35 个请求。当设置为 true 请求被限制为
在上面的例子中指定。默认为 false。
完成后,您可以根据需要将它们编写为 csv 或 JSON 或其他任何内容。对于队列,您可以使用 Bull 或 Agenda 之类的内容。
【解决方案2】:
获取所需数据的最佳方法是使用 GraphQL 和批量查询。您可以根据客户或订单数据指定您想要的内容。然后,您通过查询请求数据,然后 Shopify 将其全部打包到一个完整的 JSONL 文件中。你到处看看,等他们完成包,此时你会得到一个下载 URL,你可以在其中拥有所有数据。
分页是一种糟糕的导出数据的方式。它确实可以工作,但速度很慢,并且会出现网络错误,任何使用过 Shopify 的人都会告诉您。