在 NodeJS 中将并发请求限制为 API 以及 Async/Await
Limit concurrent requests to API in NodeJS along with Async/Await
我在我的 Nodejs 项目中使用 Request 包以及 Node V 中引入的 Async/Await 函数。8.x 使用第 3 方 API,一切都很好,直到我遇到 API 提供商的限制;谁限制每秒 10 个并发请求。
我尝试了很多可用的 NPM 包,例如 rate-limiter 等,但最近发现了一个 article relevant to my issue, which introduces me to qrate 包。
我尝试使用以下代码解决此问题:可能我需要使用回调而不是 'done' 并在我的 'fetchAPIDetails' 中处理它 - - 任何帮助是极大的赞赏。提前谢谢你。
const async = require('async')
const request = require('request-promise')
const qrate = require('qrate')
const q = qrate(worker,1,5)
const worker = async (reqBody, options, done) => {
const options = { method: 'POST', url: apiURL, body: reqBody, timeout: 5000}
try{
const response = await request(options)
if(response.error){errorHandler(response.error); return {}}
else {
const body = response.body // Expecting XML
console.log(body.toString().slice(200,350))
return body
}
return done
}
catch(err){return errorHandler(err)} //errorHandler fn
}
const fetchAPIDetails = async () => {
const IdArr = [a,b,c] // An array of id, which need to pass in reqBody
try{
async.eachLimit(IdArr, 1, async id => {
const reqBody = await queryBuilder(id) // queryBuilder fn
q.push(reqBody)
})
} catch(err){return errorHandler(err)} //errorHandler fn
}
谢谢大家,他们会在这里解决我的问题。然而,从我进一步的研究中我了解到,API 请求的并发可以直接使用 NPM-Request 包处理,遵循这个 article.
这是我的代码供参考,对于任何想要实现相同目标的人:
const request = require('request-promise')
const Parallel = require('async-parallel')
const queryBuilder = async () => { ... } // Builds my Query body (reqBody)
const errorHandler = async (error) => { ... } // Handles Error
const requestHandler = async () => {
try{
const response = await request(options)
console.log(response.toString().slice(200,350))
return response
} catch(err){return errorHandler(err)} //errorHandler fn
}
const fetchAPIDetails = async () => {
const IdArr = [a,b,c] // An array of id, which need to pass in reqBody
Parallel.concurrency = 1
try{
Parallel.each(IdArr, async id => {
const reqBody = await queryBuilder(id) // queryBuilder fn
})
} catch(err){return errorHandler(err)} //errorHandler fn
}
我在我的 Nodejs 项目中使用 Request 包以及 Node V 中引入的 Async/Await 函数。8.x 使用第 3 方 API,一切都很好,直到我遇到 API 提供商的限制;谁限制每秒 10 个并发请求。
我尝试了很多可用的 NPM 包,例如 rate-limiter 等,但最近发现了一个 article relevant to my issue, which introduces me to qrate 包。
我尝试使用以下代码解决此问题:可能我需要使用回调而不是 'done' 并在我的 'fetchAPIDetails' 中处理它 - - 任何帮助是极大的赞赏。提前谢谢你。
const async = require('async')
const request = require('request-promise')
const qrate = require('qrate')
const q = qrate(worker,1,5)
const worker = async (reqBody, options, done) => {
const options = { method: 'POST', url: apiURL, body: reqBody, timeout: 5000}
try{
const response = await request(options)
if(response.error){errorHandler(response.error); return {}}
else {
const body = response.body // Expecting XML
console.log(body.toString().slice(200,350))
return body
}
return done
}
catch(err){return errorHandler(err)} //errorHandler fn
}
const fetchAPIDetails = async () => {
const IdArr = [a,b,c] // An array of id, which need to pass in reqBody
try{
async.eachLimit(IdArr, 1, async id => {
const reqBody = await queryBuilder(id) // queryBuilder fn
q.push(reqBody)
})
} catch(err){return errorHandler(err)} //errorHandler fn
}
谢谢大家,他们会在这里解决我的问题。然而,从我进一步的研究中我了解到,API 请求的并发可以直接使用 NPM-Request 包处理,遵循这个 article.
这是我的代码供参考,对于任何想要实现相同目标的人:
const request = require('request-promise')
const Parallel = require('async-parallel')
const queryBuilder = async () => { ... } // Builds my Query body (reqBody)
const errorHandler = async (error) => { ... } // Handles Error
const requestHandler = async () => {
try{
const response = await request(options)
console.log(response.toString().slice(200,350))
return response
} catch(err){return errorHandler(err)} //errorHandler fn
}
const fetchAPIDetails = async () => {
const IdArr = [a,b,c] // An array of id, which need to pass in reqBody
Parallel.concurrency = 1
try{
Parallel.each(IdArr, async id => {
const reqBody = await queryBuilder(id) // queryBuilder fn
})
} catch(err){return errorHandler(err)} //errorHandler fn
}