首页 > 解决方案 > 如何控制nodejs循环内的速率限制

问题描述

我正在实现nodejs中间件以循环发送多个get request(100)到外部API,但由于速率限制,我不能一次发送很多请求所以我想知道是否有办法我可以在一定时间后发送每个请求,例如100 个请求 - 等待 15 分钟 - 100 个请求 - 等待 15 分钟我曾尝试使用节流方法,但它似乎不起作用

router.get('/activities/:stravaId',limiter,(req, res,done) => {

const userc=req.user;
const access_token=userc.access_token;



var _=require("underscore");
var fs=require("fs");
const ids=[5312632886,
    4952161622,....
]//100 ids
for (let i = 0; i <ids.length ; i++) {

    strava = new stravaApi.client(access_token);
   strava.activities.listLaps({ id:ids[i]},async function (err, payload) {
        if (!err) {
           console.log(payload)
            // await throttle()



            // fs.writeFile("activity-streams.json", JSON.stringify(payload), err => {
            //     if (err) throw err;
            //     console.log("Done writing"); // Success
            // var obj1 = payload ;
            //
            //
            // const result = mergeJSON.merge(obj1, obj1) ;

            //done!

            //
            // console.log(result) ;
            fs.appendFile("streamjson.json", JSON.stringify(payload), err => {
                if (err) throw err;
                console.log("Done writing"); // Success
            });

        } else {
            console.log(err)
        }
    })
}

})

标签: node.jsexpressrequestqueue

解决方案


我不确定您为什么要这样做,但是您可以使用setIntervalwhich 可以在特定时间间隔后调用该方法。您应该使用node-schedule因为它更适合您的场景。

setInterval(() =>{
    run method
}, 900000);

时间更多时推荐的选项,用于节点调度:

const schedule = require('node-schedule');

const job = schedule.scheduleJob('*/15 * * * *', () => {
  console.log('The answer to life, the universe, and everything!');
});

推荐阅读