如何使用node-fetch拉取带offset分页规则的API全量数据
分页API全量数据获取实现方案
通用循环实现(兼容任意总条数)
该方案无需手动计算请求次数,会根据接口返回的分页参数自动发起请求,后续总条数变更也不需要修改逻辑:
async function fetchAllData() { const limit = 100 let offset = 0 // 存储全量数据的数组 let allData = [] while(true) { const response = await fetch(`${baseUrl}&limit=${limit}&offset=${offset}`, { headers: { 'Content-Type': 'application/json' } }) const resData = await response.json() // 此处resData.list替换为你接口实际返回条目列表的字段名 allData = allData.concat(resData.list) // 终止请求的判断条件,二选一即可 // 方案1:用hasMore判断 if(!resData.hasMore) break // 方案2:用totalCount判断,和上面方案选一个用就行 // if(offset + limit >= resData.totalCount) break // 偏移量自增,准备下一页请求 offset += limit } // 返回合并后的全量数据 return allData } // 调用方法 const fullData = await fetchAllData()
固定两次请求实现(仅适配当前125条的场景)
如果确认当前总条数只有125条,仅需要两次请求的话可以用简化写法:
// 请求第一页 const res1 = await fetch(`${baseUrl}&limit=100&offset=0`, { headers: { 'Content-Type': 'application/json' } }) const data1 = await res1.json() // 请求第二页 const res2 = await fetch(`${baseUrl}&limit=100&offset=100`, { headers: { 'Content-Type': 'application/json' } }) const data2 = await res2.json() // 合并两页数据,list替换为实际接口返回的条目列表字段名 const fullData = [...data1.list, ...data2.list]
注意事项
- 代码中的条目列表字段
list需要替换为你接口实际返回数据列表的对应字段名 - 生产环境建议添加
try/catch块做请求异常捕获,避免单页请求失败导致全量数据获取失败 - 若接口存在请求频率限制,可在两次请求之间添加适当的延时逻辑
内容的提问来源于stack exchange,提问作者usherTc
相关产品推荐
相关产品推荐

