限制并发请求Nodejs中的API以及异步/等待



我正在我的nodejs project中使用请求软件包,以及 async/等待 node v.8.8.x 中引入的函数来消费第三方API,一切都很好,直到我遇到API提供商的限制为止;谁有限制每秒10个并发请求的限制。

我尝试了许多可用的NPM软件包,例如限制限制者等。但是,最近发现了一篇与我的问题相关的文章,该文章向我介绍了Qrate软件包。

我尝试使用以下代码来处理此问题:可能是我需要使用回调,而不是"完成"并在我的'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
}

谢谢大家,谁会在这里从事我的问题。但是,从我的进一步研究中,我可以知道,可以使用NPM-Request软件包直接处理API请求的并发性。

这是我的参考代码,适用于那些想要实现的人:

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
 }

最新更新