如何对批量 axios.all 和 axios.spread 请求进行速率限制?

问题描述 投票:0回答:1

我似乎找不到任何有关如何使用 axios.all 来限制批量请求以发出并发请求的文档或 Stack Overflow 示例。我在 GitHub 上遇到了 axiom-rate-limit ,并且找到了很多如何实现它的示例,但没有任何说明如何在使用 axios.all/axios.spread 时实现它。

这是我使用 axios.all 的主要功能

async function bulkAxios(url, idArray) {
    var token = "BEARER-TOKEN"
    const AuthStr = "Bearer ".concat(token);
    for (var i in idArray) {
        var config = {
            method: "get",
            url: url + idArray[i],
            headers: { Authorization: AuthStr },
        };
        let newPromise = axios(config)
        axiosArray.push(newPromise)
    }
    console.log("Initiating bulk promises for bulkAxios api calls.")
    const p = Promise
        .all(axiosArray)
        .then(axios.spread((...responses) => {
        responses = responses.map(item => item.data)
        console.log('All Axios API calls succeeded.');
        return(responses)
        }))
        .catch(function (error) {
            console.log(error);
        });
    return(p);
}

我尝试过添加

const apiRequest = rateLimit(axios.create(), { maxRequests: 2, perMilliseconds: 1000, maxRPS: 2 })

然后将我的函数修改为这样?

async function bulkAxios(url, idArray) {
    var token = "BEARER-TOKEN"
    const AuthStr = "Bearer ".concat(token);
    for (var i in idArray) {
        var config = {
            method: "get",
            url: url + idArray[i],
            headers: { Authorization: AuthStr },
        };
        let newPromise = http(config)
        axiosArray.push(newPromise)
    }
    console.log("Initiating bulk promises for bulkAxios api calls.")
    const p = Promise
        .all(axiosArray)
        .then(http.spread((...responses) => {
        responses = responses.map(item => item.data)
        console.log('All Axios API calls succeeded.');
        return(responses)
        }))
        .catch(function (error) {
            console.log(error);
        });
    return(p);
}

我收到此错误,因为它似乎无法访问rateLimit后面的.spread

.then(apiRequest.spread((...responses) => {
                 ^
TypeError: apiRequest.spread is not a function
at bulkAxios (/Users/user/Desktop/app/api/index.js:160:26)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async routeHandler (/Users/user/Desktop/app/api/index.js:209:25)

如果我改变

.then(http.spread((...responses)

返回

.then(axios.spread((...responses)

它有效,但我不知道它是否真的受到速率限制。

更新8/24

// limits axios api requests to 50 per second
const apiRequest = rateLimit(axios.create(), { maxRequests: 50, perMilliseconds: 1000 });

async function bulkAxios(url, idArray) {
    var token = "BEARER-TOKEN"
    const AuthStr = "Bearer ".concat(token);
    for (var i in idArray) {
        var config = {
            method: "get",
            url: url + idArray[i],
            headers: { Authorization: AuthStr },
        };
        let newPromise = apiRequest(config);
        axiosArray.push(newPromise)
    }
    console.log("Initiating bulk promises for bulkAxios api calls.")
    const p = Promise
    .all(axiosArray)
    .then(axios.spread((...responses) => {
        responses = responses.map(item => item.data)
        console.log('All Axios API calls succeeded.');
        return(responses)
    }))
    .catch(function (error) {
        console.log(error);
    });
    return(p);
}
node.js express axios rate-limiting express-rate-limit
1个回答
0
投票

用我找到的解决方案更新了原始帖子。

© www.soinside.com 2019 - 2024. All rights reserved.