【n8n教程】Loop Over Items节点,循环处理大数据量
在n8n中,处理大量数据时经常会遇到API速率限制、内存溢出或请求超时等问题。而Loop Over Items (Split in Batches) 节点就是解决这些问题的"魔法武器"!
【n8n教程】Loop Over Items节点,循环处理大数据量
在n8n中,处理大量数据时经常会遇到API速率限制、内存溢出或请求超时等问题。而Loop Over Items (Split in Batches) 节点就是解决这些问题的"魔法武器"!
🎯 什么是Split in Batches节点?
核心概念
Split in Batches(循环处理)节点的作用非常简单:
将输入的大量数据分成若干个小批次,逐个处理每个批次,处理完所有批次后再将结果合并。
为什么要使用它?
想象你有100个客户的邮箱地址,需要逐一发送邮件。如果一次性发送100封邮件,可能会:
- ❌ 触发邮件服务商的速率限制(通常限制为每分钟N封)
- ❌ 被误认为是垃圾邮件发送者
- ❌ 导致账户被临时锁定
- ❌ 整个工作流执行失败
而使用Split in Batches节点,将100个邮箱分成10个批次(每批10个),每批之间暂停5分钟,就可以完美解决这个问题!✅

🔄 Split in Batches工作流程
让我们看看这个节点内部是如何工作的:
输入数据(100项)
↓
设置批次大小为10
↓
第1次循环:处理第1-10项 → 输出到"loop"端口
↓
等待5分钟
↓
第2次循环:处理第11-20项 → 输出到"loop"端口
↓
... 继续循环 ...
↓
所有批次处理完成
↓
通过"done"端口输出合并后的所有结果
节点的三个关键输出端口
| 端口 | 说明 | 使用场景 |
|---|---|---|
| loop | 返回当前批次的数据 | 在循环内部处理每个批次 |
| done | 所有批次处理完成后输出合并结果 | 最后进行汇总或保存 |
| reject(可选) | 错误输出 | 处理失败情况 |
🛠️ 核心参数详解
1. 批次大小(Batch Size)
这是最重要的参数!它决定了每次循环要处理多少项。
| 批次大小 | 适用场景 | 优缺点 |
|---|---|---|
| 1 | 需要逐项处理、需要更细粒度控制 | ✅ 控制力强 ❌ 循环次数多 |
| 5-10 | 处理中等数据量、避免速率限制 | ✅ 平衡方案 |
| 100+ | 对速率没有限制的场景 | ✅ 效率高 ❌ 容易超限 |
💡 建议:如果不确定,先从批次大小=1开始测试,根据实际情况调整。
2. Reset选项
这个选项用于控制节点如何处理分页或循环条件:
- 启用Reset:每次循环重置为新的数据集(用于分页场景)
- 禁用Reset:继续处理数据流中的所有项(默认行为)
📊 实战案例:处理RSS源列表
现在让我们通过一个完整的实际案例来理解Split in Batches的使用。
场景描述
你想从3个不同的RSS源读取内容,但需要:
- 每次只处理1个RSS源(避免服务器认为是攻击)
- 两次请求之间间隔15分钟
- 最后记录所有结果
工作流结构
Manual Trigger
↓
Define RSS Feeds (定义3个源)
↓
Split in Batches (批次大小=1)
↓
Read RSS Feed (读取当前源)
↓
Wait 15 Minutes (等待15分钟)
↓
Loop Back to Split in Batches
↓
Log Output (最后输出结果)
完整工作流JSON代码
将以下代码复制到n8n中(Ctrl+I 或菜单 → Import from URL/Clipboard):
{
"name": "RSS Feed Batch Processing with Delays",
"nodes": [
{
"parameters": {},
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [100, 300]
},
{
"parameters": {
"functionCode": "return [\n { json: { url: 'https://medium.com/feed/n8n-io' } },\n { json: { url: 'https://dev.to/feed/n8n' } },\n { json: { url: 'https://news.ycombinator.com/rss' } }\n];"
},
"name": "Define RSS Feeds",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [300, 300]
},
{
"parameters": {
"batchSize": 1
},
"name": "Split in Batches",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 1,
"position": [500, 300]
},
{
"parameters": {
"url": "={{ $json.url }}"
},
"name": "Read RSS Feed",
"type": "n8n-nodes-base.rss",
"typeVersion": 1,
"position": [700, 300]
},
{
"parameters": {
"wait": 15,
"unit": "minutes"
},
"name": "Wait 15 Minutes",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [900, 300]
},
{
"parameters": {
"options": {}
},
"name": "Log Output",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [1100, 300]
}
],
"connections": {
"Manual Trigger": {
"main": [
[{"node": "Define RSS Feeds", "type": "main", "index": 0}]
]
},
"Define RSS Feeds": {
"main": [
[{"node": "Split in Batches", "type": "main", "index": 0}]
]
},
"Split in Batches": {
"main": [
[{"node": "Read RSS Feed", "type": "main", "index": 0}]
]
},
"Read RSS Feed": {
"main": [
[{"node": "Wait 15 Minutes", "type": "main", "index": 0}]
]
},
"Wait 15 Minutes": {
"main": [
[{"node": "Split in Batches", "type": "main", "index": 0}]
]
},
"Log Output": {
"main": [[]]
}
}
}
逐步设置说明
第1步:Manual Trigger
点击添加触发器,选择Manual Trigger(手动触发)。这个节点用来开始工作流。
第2步:Define RSS Feeds(定义RSS源)
添加Function节点,复制以下代码:
return [
{ json: { url: 'https://medium.com/feed/n8n-io' } },
{ json: { url: 'https://dev.to/feed/n8n' } },
{ json: { url: 'https://news.ycombinator.com/rss' } }
];
这会创建一个包含3个RSS源URL的数组。你可以根据需要修改URL。
第3步:Split in Batches
添加Split in Batches节点,设置:
- 批次大小:
1(每次处理1个源)
这样每个RSS源会单独处理一次。
第4步:Read RSS Feed(读取RSS内容)
添加RSS Read节点,配置:
- URL字段:使用表达式
{{ $json.url }}
这个表达式从Split in Batches节点获取当前批次的URL。
第5步:Wait(等待延迟)
添加Wait节点,设置:
- 等待时间:
15 - 时间单位:
minutes(分钟)
这会在每次读取RSS后暂停15分钟,避免频繁请求。
第6步:创建循环
关键步骤!将Wait节点的输出连接回Split in Batches节点(不是下一个节点),这样就形成了一个循环。当所有批次处理完成后,数据会自动流向"done"端口。
第7步:测试执行
点击Execute Workflow按钮测试工作流。你会看到:
- 第一个RSS源被处理
- 等待15分钟
- 第二个RSS源被处理
- 等待15分钟
- 第三个RSS源被处理
- 工作流完成
💡 常用技巧和表达式
1. 检查所有项是否已处理
在If节点中使用此表达式来检查循环是否完成:
{{$node["Split in Batches"].context["noItemsLeft"]}}
如果返回true,表示所有项已处理完成。
2. 获取当前循环的索引
如果想知道这是第几次循环,使用:
{{$node["Split in Batches"].context["currentRunIndex"]}}
示例:第1次循环返回1,第2次返回2,依此类推。
3. 条件循环(处理分页)
使用If节点和Reset选项实现分页循环:
// If节点条件:检查是否还有下一页
{{$json.hasNextPage === true}}
- 如果为true,继续循环并增加页码
- 如果为false,退出循环
✅ 最佳实践
Do’s(应该做)
✅ 设定合理的批次大小 - 根据API限制调整(通常10-50)
✅ 添加Wait节点 - 在循环中加入延迟以避免速率限制
✅ 使用表达式动态引用数据 - 如 {{ $json.fieldName }}
✅ 测试小数据集 - 先用几个项测试,确保逻辑正确后再用大数据集
✅ 记录日志 - 添加Debug节点追踪各阶段的数据
Don’ts(不应该做)
❌ 设置过大的批次大小 - 容易触发API限制导致请求失败
❌ 忘记返回循环连接 - 必须将处理节点的输出连接回Split in Batches
❌ 无限循环 - 确保有明确的循环退出条件(特别是在分页场景)
❌ 忽略错误处理 - 添加Try-Catch或Error Output来处理失败情况
🎓 进阶应用场景
场景1:发送批量邮件
Manual Trigger → 获取邮件列表 → Split in Batches(5)
→ 发送邮件 → 等待2分钟 → 循环回Split in Batches
效果:每次发送5封邮件,间隔2分钟,避免被标记为垃圾邮件。
场景2:更新数据库记录
Database Query → Split in Batches(20)
→ 调用更新API → 等待30秒 → 循环回Split in Batches
效果:每次更新20条记录,避免数据库连接超时。
场景3:处理文件列表
获取文件列表 → Split in Batches(1)
→ 处理文件(转换/上传) → 等待 → 循环
效果:逐个处理文件,可用于大文件处理场景。
🐛 常见问题排查
问题1:工作流执行后只处理了第一批
原因:忘记将处理节点连接回Split in Batches
解决:确保从处理节点(如Wait、HTTP Request等)的输出连接回Split in Batches节点的输入
问题2:循环陷入无限循环
原因:没有明确的退出条件,或Reset选项设置错误
解决:
- 检查Split in Batches的Reset选项设置
- 添加If节点作为退出条件
- 确保输入数据是有限的列表
问题3:数据在循环中丢失
原因:没有正确使用"done"输出端口
解决:在最后的节点中使用Split in Batches的**"done"输出**,而不是"loop"输出
📚 总结
你现在已经学会了:
✅ Split in Batches节点的工作原理
✅ 如何设置和配置批次大小
✅ 如何构建和调试循环工作流
✅ 实际应用场景和最佳实践
✅ 常见问题的解决方案
下一步建议:
- 在自己的n8n实例中创建这个RSS源处理工作流
- 尝试修改批次大小和等待时间,观察效果
- 将其应用到你自己的业务场景(发送邮件、更新数据库等)
- 探索与其他节点的组合(If、Merge、Set等)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)