【问题标题】:Rate limit API requests in node.jsnode.js 中的速率限制 API 请求
【发布时间】:2019-02-06 10:20:59
【问题描述】:

首先,我是新来的,所以请...温柔点...过去几个月我一直在自学 node.js,主要是希望从 FlightAware 中抓取大量数据网站 API。

我正在尝试从他们的网站请求飞机的航班列表,这是我目前所拥有的。

var aircraft = [array,of,aircraft,tail,numbers]   

for (i=0; i < aircraft.length; i++) {

    faGetFlight(aircraft[i],function doneLookup(data) {

        dbUpdateFlight(collectionName, data)
    })
}

此代码有效,但一旦列表中有超过 10 架飞机,它就会失败,因为在一分钟内发送了超过 10 个 API 请求。有什么简单/直接的方法可以稍微减慢速度。每次运行时,我想总共发送大约 50-60 个 API 请求,所以我需要间隔 5-6 分钟。 faGetFlight() 函数使用“请求”模块。我尝试了 request-rate-limit 模块而不是 request 模块,但我似乎无法让它工作。我认为授权不能与 request-rate-limiter 模块一起正常工作。收到有关匿名用户的错误。对于它的工作原理,它只适用于请求模块,但我遇到了速率限制问题。

这是我的 faGetFlight() 代码。

var RateLimiter = require('request-rate-limiter');
const REQS_PER_MIN = 10; // that's 25 per second
var limiter = new RateLimiter(REQS_PER_MIN);

//API Variables //
var apiUrl = 'url'
var apiEndpoint = 'endpoint'
var apiAuth = 'apikey'
var apiExtData = 0
var apiHowMany = 15         //Number of results to request.                                               

var options = { method: 'GET',
    url: apiUrl + apiEndpoint,
    qs: { ident: acIdent
        },

        headers: 
    { 
        Authorization: apiAuth }                  
    };

        limiter.request(options, function doneDownload(error, response, body) {         
            if (error) throw new error(error);
            callback(body)
        });

}

抱歉,如果不清楚...这是我的第一篇文章!

【问题讨论】:

  • 你的第一篇文章做得很好,欢迎来到 SO。您是否收到错误消息,如果有,在哪一行?
  • 感谢您的信任投票 :) API 正在排除错误。我每分钟执行的请求太多。
  • 你可以使用rate-limiter-flexible node.js 包。

标签: node.js api


【解决方案1】:

您可以使用函数和简单的setTimeout 进行简单的实现。

见:

var aircrafts = [array,of,aircraft,tail,numbers]; 
var REQS_PER_MIN = 10;
var MAX_AMOUNT_REQUESTS = 100;
var timeout = (1 / REQS_PER_MIN) * 60 * 1000;

processAircraft(0);

function processAircraft(index){
    if(index >= MAX_AMOUNT_REQUESTS)
        return console.log("All done!");
    //On start of function, schedule next processing in "timeout" ms
    setTimeout(function(){
        processAircraft(index+1);
    }, timeout);

    faGetFlight(aircrafts[index], function doneLookup(data) {
        dbUpdateFlight(collectionName, data)
    })
}

【讨论】:

  • 是的,明白了。谢谢!当我看到它写出来的时候似乎很简单!。
  • 没问题!安全飞行。
  • 抱歉,我刚刚注意到一个问题......它循环了一到多次,最后抛出一个“未定义”错误。
  • 我在大约 30 分钟前将代码编辑为 &gt;= 而不是 if(index &gt;= MAX_AMOUNT_REQUESTS) 中的 &gt;,你有吗?
  • 我现在看到了,没注意到。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2019-02-28
相关资源
最近更新 更多