我似乎找不到任何有关如何使用 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);
}
用我找到的解决方案更新了原始帖子。