我正在开发一个简单的应用程序,它使用第三方应用程序接口(Shopify REST API),Shopify API被限制为允许无限制的请求,通过一个漏桶算法,这是detailed in their documentation。
我正在使用Shopify-api-node模块进行API调用,它支持开箱即用的autoLimit选项,该选项可以自动限制发出请求的速率,因此您不必考虑API调用限制。
这适用于大多数Node.js脚本,但在Express应用程序的上下文中会遇到麻烦,您需要通过会话在不同的路由上共享autoLimit实例,因为只有一个Shopify实例的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:
http://localhost:3000?shopName=liquify-app.myshopify.com&apiKey=9d1fae34bf670cc71230fee001486e82&password=dc6f650d5921eb40e7ab1e612e9dae7e
这将向Shopify API发出100个请求,将API凭证存储在会话中,并显示商店JSON数据。
如果您同时在两个选项卡中打开相同的URL,或者同时打开http://localhost:3000/other-route,就会出现这种情况。这是因为我不知道如何在我的路由之间共享相同的Shopify应用程序接口实例。
我需要能够跨我的路由对API进行尽可能多的调用,而不会遇到“请求太多”的错误。
任何帮助都将不胜感激。
发布于 2019-04-03 03:56:41
我想你这里的阻抗不匹配。Shopify是有限制的。它准确地告诉你你所在的位置。所以你提出了一个请求。您得到的响应头将告诉您还可以发出多少请求。这就是你使用的数字。
你说,我的代码将限制自身,以免惹恼那里的怪物,这种方法将会失败,因为这不是真正构建请求-响应周期的方法。
也许在发出另一个请求之前,可以尝试查看您得到的响应。如果你已经达到了极限,暂停一下,等待水桶稍微充电。标准的东西。效果很好。
https://stackoverflow.com/questions/55482419
复制相似问题