如何解决Node.js中的“请求过多”错误?

时间:2018-11-03 02:08:18

标签: javascript node.js http promise axios

我正在尝试通过使用JSON连续创建HTTP requests来构建Axios文件:

  1. 获取对象(项目)的数组
  2. 在每个名为附件的项目中创建一个数组属性
  3. 获取每个项目的任务
  4. 获取每个任务的附件
  5. 将每个项目任务的附件放入项目的附件数组中
  6. 从修改后的项目数组中创建JSON文件

代码:

let getProjects = function() {
  try {
    return axios.get('https://app.asana.com/api/1.0/projects/')
  } catch (error) {
    console.error(error)
  }
}

let getTasks = function(project) {
  try {
    return axios.get('https://app.asana.com/api/1.0/projects/'+project+'/tasks')
  } catch (error) {
    console.error(error)
  }
}

let getAttachments = function(task) {
  try {
    return axios.get('https://app.asana.com/api/1.0/tasks/'+task+'/attachments')
  } catch (error) {
    console.error(error)
  }
}

async function getAsanaData() {
  let projects = await getProjects()
  return Promise.all(projects.data.data.map(async (project) => {
      project.attachments = []
      let tasks = await getTasks(project.gid)
      return Promise.all(tasks.data.data.map(async (task) => {
        let attachments = await getAttachments(task.gid)
        project.attachments = !!attachments ? project.attachments.concat(attachments.data.data) : project.attachments 
        return project
      }))
  }))
}

getAsanaData()
.then((projects) => {  
  var asanaData = safeJsonStringify(projects);
  fs.writeFile("thing.json", asanaData);
})
.catch(err=>console.log(err))

但是我遇到了这个错误:

status: 429,
statusText: 'Too Many Requests

对于解决该问题,我还没有发现任何帮助。我该怎么办?

2 个答案:

答案 0 :(得分:0)

HTTP响应状态代码429指示发送的请求太多,服务器无法处理。它也已在https://asana.com/developers/documentation/getting-started/errors中记录。根据{{​​3}}中的记录,允许的最大值是每分钟150。

是的,正如@Randy Casburn所说,您将必须限制您的请求。

答案 1 :(得分:0)

由于发送太多请求并达到最高速率,您被Asana限制了。

发生这种情况时,您需要检查Retry-After响应标头并等待指定的时间,然后再发送另一个请求。

https://asana.com/developers/documentation/getting-started/rate-limits

您还可以在RFC 6585 about HTTP 429

中了解更多信息