在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
相关产品推荐
相关产品推荐

