限制外部API请求

时间:2015-08-20 07:50:36

标签: node.js

我正在尝试限制在node.js代码中使用外部API。 我已经设置了node rate limiter,但它似乎没有用。我还是打了429。我不应该做什么呢?

var RateLimiter = require('limiter').RateLimiter;   // Rate limits
var limiter     = new RateLimiter(1, 2000);  // one call every two seconds

self.riotAPI = function(options, cb){
    limiter.removeTokens(1, function() {
        https.request(options, function(response) {
            // Error handling
            response.on('error', function (e) {
              console.log(e);
            });

            var str = '';

            // Another chunk of data has been recieved, so append it to `str`
            response.on('data', function (chunk) {
                str += chunk;
            });

            // Parse and return the object
            response.on('end', function () {
                if(response.statusCode >= 400) {
                    var err = "HTTP response "+response.statusCode;
                    console.log(err);
                    cb(new Error("err"), null);
                }
                else {
                    cb(null, JSON.parse(str));
                }
            });
        }).end();
    });
}

1 个答案:

答案 0 :(得分:0)

我切换到瓶颈,让所有功能都按预期运行。

self.riotAPI = function(options, cb){
    limiter.submit( function(lcb) {
        https.request(options, function(response) {
            // Error handling
            response.on('error', function (e) {
              console.log(e);
            });

            var str = '';

            // Another chunk of data has been recieved, so append it to `str`
            response.on('data', function (chunk) {
                str += chunk;
            });

            // Parse and return the object
            response.on('end', function () {
                if(response.statusCode >= 400) {
                    var err = "HTTP response "+response.statusCode;
                    console.log(err);
                    // If it's a 429, retry
                    if(response.statusCode == 429) {
                        console.log("retrying...");
                        self.riotAPI(options, cb);
                    }
                    // If not, fail
                    else {
                        cb(new Error("err"), null);
                        lcb();
                    }
                }
                else {
                    cb(null, JSON.parse(str));
                    lcb();
                }
            });
        }).end();
    }, null);
}