无法使用针对API请求的请求限制器访问数组的元素

时间:2019-05-31 10:47:28

标签: javascript node.js request

首先,谢谢您在这里的时间。

我正在使用node.js以编程方式进行API调用。我有一个充满数字的数组,我想遍历它以发送API请求以检查数字是否有效。问题是我需要管理我的API请求的吞吐量以避免HTTP 429(由于API提供程序限制)。我还使HTTP连接保持活动状态,以加快请求速度。

我正在使用外部请求限制器https://www.npmjs.com/package/limiter

为简单起见,我将把数字检查作为依赖项包括在内,该依赖项虽然不存在,但是是为了避免使事情变得更复杂。

我的代码如下:

    var RateLimiter = require('limiter').RateLimiter;
    var http = require('http');
    var Checknumber = require('numbercheck')
    var agent = new http.Agent({
    keepAlive: true,
    maxSockets: 1,
    keepAliveMsecs: 3000
    })

//final is the array containing 100 phone numbers
var final = [xxxxxxxx, xxxxx, .......,];




//This limit the API requests to 1 per second
 var limiter = new RateLimiter(1, 'second');


for  (x=0; x<final.length; x++){

   limiter.removeTokens(1, function() {

    console.log(final[x], x);
//This console.log is to debug  

Checknumber.get({ number: final[x]}, (error, response) => {
      if (error) {
        console.error(error)
      }  
      else {
        console.log(response)

      }

    }
)}
)}

我得到的结果是final[x] is undefined,因此API请求失败了

console.log(final[x], x)返回:undefined 100

似乎无法通过索引访问final[x]

能在这里帮忙吗?

致谢

我还试图在final[x]中传递limiter.removeTokens(1, function(final[x]) {... 但我得到

  

SyntaxError:意外令牌[

1 个答案:

答案 0 :(得分:0)

您错过了for循环中的变量分配: (var x = 0; x < final.length; x++)

我注意到的其他事情:

  1. 这取决于您的编码风格和偏好,但是在大多数情况下,循环时,我更喜欢使用.forEach()或.map()之类的迭代器,因为它使代码更具声明性。在这种情况下,.forEach将是正确的迭代器。
  2. 如果发现一致的代码,我发现它更容易调试,请考虑使用ECMAScript版本语法,因此,如果要使用ES6(使用箭头功能),请在整个过程中使用它。还可以考虑使用const并使用var代替。

    final.forEach((item, index) => {
      limiter.removeTokens(1, () => {
         console.log(item, index);
         Checknumber.get({ number: item}, (error, response) => {
           if (error) {
             console.error(error)
           } else {
             console.log(response)
           }
         })
       })
     }