2017-12-13 4 views
2
내가 제 3 자 API를 소비 노드 V.8.x에 도입 비동기/기다리고 있습니다 기능과 함께 내 Nodejs 프로젝트에 Request 패키지를 사용하고

, 모든했다 API 제공 업체로부터 제한을받을 때까지 괜찮습니다. 누가 초당 10 개의 동시 요청을 제한합니다.제한 동시 요청

나는 rate-limiter와 같은 많은 NPM 패키지를 시도했지만, 최근 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 
} 

답변

1

내 문제를 해결해 주신 모든 분들께 감사드립니다. 그러나 API 요청의 동시성은 article 다음에 NPM-Request 패키지를 사용하여 직접 처리 할 수 ​​있다는 것을 알게되었습니다. 여기

같은 달성하고 싶은 사람을위한 참조 내 코드입니다 :

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 
}