我正在开发一个使用第三方API(Shopify REST API)的简单应用程序,Shopify API被限制为允许随着时间的推移无限请求,但是漏桶算法是detailed in their documentation。
我正在使用Shopify-api-node模块进行API调用,它支持开箱即用的autoLimit
选项,可自动限制请求的速率,因此您无需考虑API调用限制。
这适用于大多数Node.js脚本,但是在Express应用程序的上下文中遇到麻烦,您需要通过会话跨不同路径共享API实例,因为autoLimit
选项仅对单个Shopify
实例可靠。
这是我的代码(注意我正为每条路线创建一个新的Shopify
实例):
var express = require("express");
var session = require("express-session");
var Shopify = require("shopify-api-node");
var app = express();
var port = 3000;
app.use(session({
secret: "secret",
resave: false,
saveUninitialized: true
}));
app.get("/", (req, res) => {
var shopName = req.session.shopName = req.session.shopName || req.query.shopName;
var apiKey = req.session.apiKey = req.session.apiKey || req.query.apiKey;
var password = req.session.password = req.session.password || req.query.password;
var shopify = new Shopify({ shopName, apiKey, password, autoLimit: true });
shopify.on("callLimits", (limits) => console.log(limits));
var requests = Array.from({ length: 100 }, () => {
return shopify.shop.get()
});
Promise.all(requests)
.then((requestsRes) => {
return res.send(JSON.stringify(requestsRes));
})
.catch((err) => {
return res.status(500).send(err);
});
});
app.get("/other-route", (req, res) => {
var shopName = req.session.shopName = req.session.shopName || req.query.shopName;
var apiKey = req.session.apiKey = req.session.apiKey || req.query.apiKey;
var password = req.session.password = req.session.password || req.query.password;
var shopify = new Shopify({ shopName, apiKey, password, autoLimit: true });
shopify.on("callLimits", (limits) => console.log(limits));
var requests = Array.from({ length: 100 }, () => {
return shopify.product.list()
});
Promise.all(requests)
.then((requestsRes) => {
return res.send(JSON.stringify(requestsRes));
})
.catch((err) => {
return res.status(500).send(err);
});
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}!`)
});
这是我的package.json
:
{
"name": "third-party-api-limit-issue",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.16.4",
"express-session": "^1.15.6",
"shopify-api-node": "^2.18.1"
}
}
运行此脚本时,请转到以下URL:
这将向Shopify API发出100个请求,将API凭据存储在会话中并显示商店JSON数据。
如果您同时在两个选项卡中打开相同的URL,或者同时打开http://localhost:3000/other-route
,则会中断此操作。发生这种情况是因为我无法弄清楚如何在我的路线上共享相同的Shopify
API实例。
我需要能够跨越我的路由调用API,而不会遇到“Too many requests”错误。
任何帮助将不胜感激。
我认为你的阻抗不匹配。 Shopify有一个限制。它告诉你你到底在哪里。所以你提出了一个请求。您获得的响应标头会告诉您可以提出多少请求。这是你使用的数字。
你说的方法,我的代码将限制自己,以免在那里搔痒怪物,将爆炸,因为这不是真正构建请求 - 响应周期的方式。
也许尝试在发出另一个请求之前查看您获得的响应。如果你已达到极限,请在等待水桶充电时暂停。标准的东西。效果很好。