最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

限制NodeJS中API的并发请求以及AsyncAwait

运维笔记admin12浏览0评论

限制NodeJS中API的并发请求以及Async / Await

限制NodeJS中API的并发请求以及Async / Await

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

我尝试了许多可用的NPM软件包,如速率限制器等,但最近发现了一个与我的问题相关的article,它向我介绍了qrate软件包。

我尝试使用下面的代码来处理这个问题:可能我需要使用Callback而不是'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
 }
发布评论

评论列表(0)

  1. 暂无评论