在n8n中,处理大量数据时经常会遇到API速率限制、内存溢出或请求超时等问题。而Loop Over Items (Split in Batches) 节点就是解决这些问题的"魔法武器"!
Split in Batches(循环处理)节点的作用非常简单:
将输入的大量数据分成若干个小批次,逐个处理每个批次,处理完所有批次后再将结果合并。
想象你有100个客户的邮箱地址,需要逐一发送邮件。如果一次性发送100封邮件,可能会:
而使用Split in Batches节点,将100个邮箱分成10个批次(每批10个),每批之间暂停5分钟,就可以完美解决这个问题!✅
让我们看看这个节点内部是如何工作的:
输入数据(100项)
↓
设置批次大小为10
↓
第1次循环:处理第1-10项 → 输出到"loop"端口
↓
等待5分钟
↓
第2次循环:处理第11-20项 → 输出到"loop"端口
↓
... 继续循环 ...
↓
所有批次处理完成
↓
通过"done"端口输出合并后的所有结果| 端口 | 说明 | 使用场景 |
|---|---|---|
| loop | 返回当前批次的数据 | 在循环内部处理每个批次 |
| done | 所有批次处理完成后输出合并结果 | 最后进行汇总或保存 |
| reject(可选) | 错误输出 | 处理失败情况 |
这是最重要的参数!它决定了每次循环要处理多少项。
| 批次大小 | 适用场景 | 优缺点 |
|---|---|---|
| 1 | 需要逐项处理、需要更细粒度控制 | ✅ 控制力强 ❌ 循环次数多 |
| 5-10 | 处理中等数据量、避免速率限制 | ✅ 平衡方案 |
| 100+ | 对速率没有限制的场景 | ✅ 效率高 ❌ 容易超限 |
💡 建议:如果不确定,先从批次大小=1开始测试,根据实际情况调整。
这个选项用于控制节点如何处理分页或循环条件:
现在让我们通过一个完整的实际案例来理解Split in Batches的使用。
你想从3个不同的RSS源读取内容,但需要:
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 (最后输出结果)将以下代码复制到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": [[]]
}
}
}点击添加触发器,选择Manual Trigger(手动触发)。这个节点用来开始工作流。
添加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。
添加Split in Batches节点,设置:
1(每次处理1个源)这样每个RSS源会单独处理一次。
添加RSS Read节点,配置:
{{ $json.url }}这个表达式从Split in Batches节点获取当前批次的URL。
添加Wait节点,设置:
15minutes(分钟)这会在每次读取RSS后暂停15分钟,避免频繁请求。
关键步骤!将Wait节点的输出连接回Split in Batches节点(不是下一个节点),这样就形成了一个循环。当所有批次处理完成后,数据会自动流向"done"端口。
点击Execute Workflow按钮测试工作流。你会看到:
在If节点中使用此表达式来检查循环是否完成:
{{$node["Split in Batches"].context["noItemsLeft"]}}如果返回true,表示所有项已处理完成。
如果想知道这是第几次循环,使用:
{{$node["Split in Batches"].context["currentRunIndex"]}}示例:第1次循环返回1,第2次返回2,依此类推。
使用If节点和Reset选项实现分页循环:
// If节点条件:检查是否还有下一页
{{$json.hasNextPage === true}}✅ 设定合理的批次大小 - 根据API限制调整(通常10-50)
✅ 添加Wait节点 - 在循环中加入延迟以避免速率限制
✅ 使用表达式动态引用数据 - 如 {{ $json.fieldName }}
✅ 测试小数据集 - 先用几个项测试,确保逻辑正确后再用大数据集
✅ 记录日志 - 添加Debug节点追踪各阶段的数据
❌ 设置过大的批次大小 - 容易触发API限制导致请求失败
❌ 忘记返回循环连接 - 必须将处理节点的输出连接回Split in Batches
❌ 无限循环 - 确保有明确的循环退出条件(特别是在分页场景)
❌ 忽略错误处理 - 添加Try-Catch或Error Output来处理失败情况
Manual Trigger → 获取邮件列表 → Split in Batches(5)
→ 发送邮件 → 等待2分钟 → 循环回Split in Batches效果:每次发送5封邮件,间隔2分钟,避免被标记为垃圾邮件。
Database Query → Split in Batches(20)
→ 调用更新API → 等待30秒 → 循环回Split in Batches效果:每次更新20条记录,避免数据库连接超时。
获取文件列表 → Split in Batches(1)
→ 处理文件(转换/上传) → 等待 → 循环效果:逐个处理文件,可用于大文件处理场景。
原因:忘记将处理节点连接回Split in Batches
解决:确保从处理节点(如Wait、HTTP Request等)的输出连接回Split in Batches节点的输入
原因:没有明确的退出条件,或Reset选项设置错误
解决:
原因:没有正确使用"done"输出端口
解决:在最后的节点中使用Split in Batches的**"done"输出**,而不是"loop"输出
你现在已经学会了:
✅ Split in Batches节点的工作原理
✅ 如何设置和配置批次大小
✅ 如何构建和调试循环工作流
✅ 实际应用场景和最佳实践
✅ 常见问题的解决方案
下一步建议:
[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#