首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在整个会话期间共享第三方API速率限制

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

Stack Overflow用户
提问于 2019-04-03 03:43:37
回答 1查看 257关注 0票数 0

我正在开发一个简单的应用程序,它使用第三方应用程序接口(Shopify REST API),Shopify API被限制为允许无限制的请求,通过一个漏桶算法,这是detailed in their documentation

我正在使用Shopify-api-node模块进行API调用,它支持开箱即用的autoLimit选项,该选项可以自动限制发出请求的速率,因此您不必考虑API调用限制。

这适用于大多数Node.js脚本,但在Express应用程序的上下文中会遇到麻烦,您需要通过会话在不同的路由上共享autoLimit实例,因为只有一个Shopify实例的Shopify选项是可靠的。

下面是我的代码(请注意,我正在为每个路由创建一个新的Shopify实例):

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "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进行尽可能多的调用,而不会遇到“请求太多”的错误。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-04-03 03:56:41

我想你这里的阻抗不匹配。Shopify是有限制的。它准确地告诉你你所在的位置。所以你提出了一个请求。您得到的响应头将告诉您还可以发出多少请求。这就是你使用的数字。

你说,我的代码将限制自身,以免惹恼那里的怪物,这种方法将会失败,因为这不是真正构建请求-响应周期的方法。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55482419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档