You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Nestjs中如何分块发送GraphQL请求 是否可通过axios.all实现

需求实现解答

结论

可以通过axios.all实现该需求,实现逻辑为:先将deviceIds数组按20项/块的规则拆分,为每个块生成独立的请求实例,通过axios.all并行执行所有请求后合并返回结果即可。

实现代码

1. 数组分块工具函数

// 按指定大小拆分数组
const chunk = (arr, size) => {
  const res = []
  for (let i = 0; i < arr.length; i += size) {
    res.push(arr.slice(i, i + size))
  }
  return res
}

2. 封装单个GraphQL请求

注意:你原有代码存在语法错误,variables是和query平级的请求参数,不能写在query字符串内部,以下代码已修正该问题

const fetchSingleChunk = async (deviceIdChunk) => {
  try {
    const res = await axios({
      url: `${process.env.HOST}/graphql`,
      method: 'post',
      data: {
        query: `query goes here`, // 替换为你的实际查询语句
        variables: {
          deviceIds: deviceIdChunk
        }
      }
    })
    return res.data?.data || []
  } catch (err) {
    throw new HttpException(err.response, 400)
  }
}

3. 批量请求执行逻辑

// 拆分deviceIds数组
const deviceIdChunks = chunk(result, 20)
// 生成请求实例数组
const requestArr = deviceIdChunks.map(chunk => fetchSingleChunk(chunk))
// 并行执行所有请求
const resList = await axios.all(requestArr)
// 合并所有返回结果得到完整数据
const graphqlData = resList.flat()

注意事项

  • 如果担心接口限流,可将并行请求改为串行执行,或调整分块大小降低请求并发量
  • 若需兼容部分请求失败的场景,可将axios.all替换为axios.allSettled,自行过滤失败的请求结果
  • 需确保GraphQL接口支持接收长度为20的deviceIds参数,且单次返回的数据量符合接口限制

内容的提问来源于stack exchange,提问作者gurbajani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:15:07