如何在Directus Flow中为外部API实现分页功能?
解决Directus Flow中外部API分页获取数据的问题
要实现分页获取外部API的全部数据,你可以在Flow中添加自定义脚本替代单次Webhook请求,通过循环调用API收集所有分页数据,再传递给后续处理Flow。以下是具体实现步骤:
前提确认
先明确外部API的分页规则:
- 分页参数:比如是
page+per_page(页码+每页条数)还是offset+limit(偏移量+每页条数) - 返回标识:是否返回总页数、总条数,或者通过当前页数据长度判断是否还有下一页
流程调整
将原有流程修改为:
手动触发 → 自定义脚本(循环调用API获取全量数据) → 调用目标Flow处理数据
自定义脚本示例
场景1:API使用page+per_page参数,返回包含total_pages字段
// 初始化变量 let allData = []; let currentPage = 1; const perPage = 100; // 与API每页返回条数一致 const apiUrl = '你的外部API地址'; // 循环拉取所有分页数据 while (true) { // 发起带分页参数的API请求 const response = await fetch(`${apiUrl}?page=${currentPage}&per_page=${perPage}`, { method: 'GET', headers: { // 若API需要认证,在此添加头部信息,例如: // 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' } }); // 处理请求失败情况 if (!response.ok) { throw new Error(`API请求失败: ${response.statusText}`); } const result = await response.json(); // 合并当前页数据到总数组 allData = allData.concat(result.data); // 判断是否还有下一页 if (currentPage >= result.total_pages || result.data.length === 0) { break; } currentPage++; // 可选:添加1秒延迟,避免触发API限流 await new Promise(resolve => setTimeout(resolve, 1000)); } // 将全量数据传递给后续Flow return { data: allData };
场景2:API使用offset+limit参数
let allData = []; let offset = 0; const limit = 100; const apiUrl = '你的外部API地址'; while (true) { const response = await fetch(`${apiUrl}?offset=${offset}&limit=${limit}`, { method: 'GET', headers: { /* 认证头部信息 */ } }); if (!response.ok) { throw new Error(`请求失败: ${response.statusText}`); } const result = await response.json(); allData = allData.concat(result.data); // 当返回数据不足limit条时,说明已无更多数据 if (result.data.length < limit) { break; } offset += limit; await new Promise(resolve => setTimeout(resolve, 1000)); } return { data: allData };
后续对接处理Flow
脚本执行完成后,将输出的data数组作为参数传递给原有的循环处理Flow,让其按原有逻辑逐条处理数据即可。
注意事项
- 根据外部API的实际返回结构和分页规则修改脚本中的参数判断逻辑
- 若API有请求频率限制,务必添加延迟避免被封禁
- 若数据量过大,需关注Directus脚本的执行超时限制,必要时拆分流程为多个批次处理
内容的提问来源于stack exchange,提问作者Eleonora Iacopini
相关产品推荐
相关产品推荐

