在整个会话期间共享第三方API速率限制

问题描述 投票:0回答:1

我正在开发一个使用第三方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:

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实例。

我需要能够跨越我的路由调用API,而不会遇到“Too many requests”错误。

任何帮助将不胜感激。

node.js api express shopify rate-limiting
1个回答
0
投票

我认为你的阻抗不匹配。 Shopify有一个限制。它告诉你你到底在哪里。所以你提出了一个请求。您获得的响应标头会告诉您可以提出多少请求。这是你使用的数字。

你说的方法,我的代码将限制自己,以免在那里搔痒怪物,将爆炸,因为这不是真正构建请求 - 响应周期的方式。

也许尝试在发出另一个请求之前查看您获得的响应。如果你已达到极限,请在等待水桶充电时暂停。标准的东西。效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.