Node.js中的速率限制API请求

时间:2019-02-06 01:48:50

标签: node.js api

首先,我是新来的,所以请...要温柔...过去几个月来我一直在自学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)
        });

}

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

1 个答案:

答案 0 :(得分:0)

您可以使用函数和简单的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)
    })
}
相关问题