【问题标题】:Limit concurrent requests to API in NodeJS along with Async/Await限制 NodeJS 中对 API 的并发请求以及 Async/Await
【发布时间】:2018-05-27 09:42:09
【问题描述】:

我在我的 Nodejs 项目中使用 Request 包以及 Node V.8.x 中引入的 Async/Await 函数来使用 3rd 方 API,一切正常很好,直到我遇到 API 提供者的限制;谁有每秒10个并发请求的限制。

我尝试了许多可用的 NPM 包,例如 rate-limiter 等,但最近发现了一个与我的问题相关的 article,它向我介绍了 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
}

【问题讨论】:

    标签: node.js async-await rate-limiting npm-request


    【解决方案1】:

    谢谢大家,他们会在这里解决我的问题。但是,从我进一步的研究中我了解到,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
     }
    

    【讨论】:

      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 2018-06-04
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多