Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 阻止在请求过多后发生429的API_Javascript_Reactjs_Throttling_Rate Limiting - Fatal编程技术网

Javascript 阻止在请求过多后发生429的API

Javascript 阻止在请求过多后发生429的API,javascript,reactjs,throttling,rate-limiting,Javascript,Reactjs,Throttling,Rate Limiting,我试图向发出多个请求,在某个时间范围内发出一定数量的请求后,我超时(状态代码429)。我已经尝试了几个库,试图让这个工作 我试着使用下面的库,但这不起作用,因为BGG似乎对其速率限制非常积极,而且他们也没有公布官方限制 /*简单速率限制器初始化(https://www.npmjs.com/package/simple-rate-limiter) */ const limit=require(‘简单速率限制器’); const request=限制(require('request'))。至(10

我试图向发出多个请求,在某个时间范围内发出一定数量的请求后,我超时(状态代码429)。我已经尝试了几个库,试图让这个工作

我试着使用下面的库,但这不起作用,因为BGG似乎对其速率限制非常积极,而且他们也没有公布官方限制

/*简单速率限制器初始化(https://www.npmjs.com/package/simple-rate-limiter) */
const limit=require(‘简单速率限制器’);
const request=限制(require('request'))。至(10).每(1000);
const fetchStatistics=async(游戏)=>{
/*从单独的API获取统计信息,因为基本API不包含统计信息*/
常量url=https://cors-anywhere.herokuapp.com/https://www.boardgamegeek.com/xmlapi2/thing?id=“+游戏。$.objectid+”&stats=1';
请求(url,(err,res,body)=>{//发出请求的简单速率限制器
constxml=body;
返回XML2JS.parseString(xml,(err,result)=>{//XML2JS库调用
控制台日志(结果);
})
})
}
然后我尝试将库与下面所示的简单速率限制器结合使用,但仍然没有成功

/*简单速率限制器初始化(https://www.npmjs.com/package/simple-rate-limiter) */
const limit=require(‘简单速率限制器’);
const request=限制(require('request'))。至(10).每(1000);
/*回退初始化(https://www.npmjs.com/package/oibackoff) */
const backoff=require('oibackoff')。backoff({
算法:'指数',
比例:1,
最大值:0,
});
const fetchStatistics=async(游戏)=>{
/*从单独的API获取统计信息,因为基本API不包含统计信息*/
常量url=https://cors-anywhere.herokuapp.com/https://www.boardgamegeek.com/xmlapi2/thing?id=“+游戏。$.objectid+”&stats=1';
退避(请求、url、(错误、恢复、正文)=>{//发出请求的简单速率限制器
console.log(res.statusCode);
constxml=res.body;
返回XML2JS.parseString(xml,(err,result)=>{
控制台日志(结果);
})
})
}
我做错什么了吗?我应该使用不同的库/方法吗



旁注:我也尝试了,但我无法获得用于我的项目的语法。

此解决方案是专门针对

因此,不要执行一系列单独的请求,例如:
/xmlapi2/thing?stats=1&id=188920

/xmlapi2/thing?stats=1&id=174476

您可以将它们全部批处理到一个请求中,如下所示:
/xmlapi2/thing?stats=1&id=188920174476

这意味着您只发送了1个请求,不会受到速率限制。
我确实发现,如果你附加了超过1200个游戏ID,这仍然会失败。服务器响应的
414请求URI太大

下面是这个错误的一个例子


如果您需要超过1200个,那么您可能需要拆分游戏ID并发出多个请求,以便一次只请求1200个。

如果您仍然获得429个,可能您只需要不断更改数字,直到不再发生这种情况。从每10秒1个请求开始,然后报告。您可能还受到使用cors anywhere服务的限制。如果有其他人通过cors在任何地方做同样的事情,那么你们都有相同的限制。将它用于任何严肃的事情都不是一个好主意。是的,将请求的速度减慢会起作用,但是对于一个有600个请求的集合,以这样的速度加载需要几个小时。我对这个问题的主要关注是我是否滥用了
oibackoff
库。当它遇到429时,它似乎没有后退。它只是不断地敲打着请求。问题是,如果你或多或少地找到了极限,无论如何也没有办法超越它。指数退避可能会更慢,即使你确实让它工作。另外,你仍然在与其他任何地方使用cors的人共享你的请求池,这是你没有解决的问题。是的,你是对的。cors anywhere github提到我使用的URL仅用于演示目的。我已经在Heroku上托管了自己的实例,并将继续测试。