Во-первых, я здесь новенький, поэтому, пожалуйста... будьте нежны... Последние несколько месяцев я изучаю node.js, в основном с желанием собрать кучу данных из API веб-сайта FlightAware.
Пытаюсь запросить с их сайта список рейсов для самолетов, вот что у меня пока есть.
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() использует модуль запроса. Я пробовал модуль ограничения скорости запроса вместо модуля запроса, но не могу заставить его работать. Я не думаю, что авторизация работает должным образом с модулем ограничения скорости запроса. Получение ошибки об анонимном пользователе. Для того, что это работает, вместо этого он работает только с модулем запроса, но я сталкиваюсь с проблемами ограничения скорости.
Вот мой код 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)
});
}
Извините, если это не ясно... это мой первый пост!
Спасибо за вотум доверия :) API отбрасывал ошибку. Я выполнял слишком много запросов в минуту.
Для этого вы можете использовать пакет гибкий ограничитель скорости node.js.





Вы можете сделать наивную реализацию, используя функции и простой 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.info("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)
})
}
Ага, понял. Спасибо! Кажется таким простым, когда я вижу, что это написано!.
Без проблем! Летайте безопасно.
Извините, я только что заметил одну проблему ... она зацикливается от одного до многих раз и в конце выдает «неопределенную» ошибку.
Я отредактировал код на >= вместо > в if (index >= MAX_AMOUNT_REQUESTS) около 30 минут назад, он у вас есть?
Теперь вижу, не заметил. Спасибо
Вы отлично справились со своим первым постом, и добро пожаловать в ТАК. Вы получаете сообщение об ошибке, и если да, то в какой строке?