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

问题描述 投票:0回答:2

我正在尝试通过使用

JSON
连续创建
HTTP requests
来构建
Axios
文件:

  1. 获取对象(项目)数组
  2. 在每个名为 Attachments 的项目中创建一个数组属性
  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

我还没有发现任何有助于解决该问题的信息。我能做什么?

javascript node.js http axios http-status-code-429
2个回答
0
投票

HTTP 响应状态代码 429 表示发送的请求数量超出了服务器的处理能力。它也已记录在https://asana.com/developers/documentation/getting-started/errors。允许的最大数量为每分钟 150 个,如 https://asana.com/developers/documentation/getting-started/rate-limits 中所述。

所以,是的,正如 @Randy Casburn 评论的那样,你将不得不限制你的请求。


0
投票

您因发送过多请求并达到最大速率而受到 Asana 的限制。

发生这种情况时,您需要检查

Retry-After
响应标头并等待指定的时间,然后再发送另一个请求。

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

您还可以在 RFC 6585 中了解有关 HTTP 429 的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.