Я разрабатываю простое приложение, которое использует сторонний API (Shopify REST API), API Shopify регулируется, чтобы разрешать неограниченное количество запросов с течением времени, хотя алгоритм с утечкой памяти, который подробно описан в их документации .
Я использую модуль 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:
http://localhost:3000? ShopName = liquify-app.myshopify.com & apiKey = 9d1fae34bf670cc71230fee001486e82 и пароль = dc6f650d5921eb40e7ab1e612e9dae7e
Это сделает 100 запросов к Shopify API, сохранит учетные данные API в сеансе и отобразит данные магазина JSON.
Это прерывается, если вы одновременно открываете один и тот же URL на двух вкладках или одновременно открываете http://localhost:3000/other-route
. Это происходит потому, что я не могу понять, как использовать один и тот же экземпляр Shopify
API для моих маршрутов.
Мне нужно иметь возможность совершать как можно больше вызовов API по всем маршрутам, не сталкиваясь с ошибкой "Too many questions".
Любая помощь будет принята с благодарностью.