【n8n教程】:掌握n8n流程逻辑,构建复杂自动化工作流
在n8n中构建自动化工作流时,你不仅需要连接不同的应用程序,还需要根据不同的条件做出决策、处理多个数据流、循环处理数据以及处理可能出现的错误。这正是流程逻辑(Flow Logic)的用武之地。
流程逻辑是n8n中表示复杂业务规则的核心能力。它让你能够构建真实世界的自动化流程,而不仅仅是简单的线性工作流。本教程将帮你快速理解和掌握n8n中的所有流程逻辑概念。
1. 条件分支:使用IF节点和Switch节点分割工作流
什么是条件分支?
条件分支允许你根据特定条件将单分支工作流转变为多分支工作流。当数据流经过IF或Switch节点时,系统会根据条件判断,将数据路由到不同的分支进行处理。
核心概念
- IF节点:最常用的条件节点,支持简单的真/假(True/False)条件判断
- Switch节点:支持多个条件分支,适合复杂的多路选择场景
实战例子:使用IF节点处理订单
假设你有一个订单管理系统,需要根据订单金额是否超过100来决定是否需要特殊审批:
- 添加IF节点,设置条件:
{{ $json.orderAmount > 100 }} - 在"True"分支:将订单发送给审批部门
- 在"False"分支:直接发送确认邮件
Switch节点的优势
当你有多个条件需要判断时,Switch节点比多个IF节点更简洁。例如,根据订单状态(待处理、已发货、已完成)执行不同的操作。
关键点:条件分支是构建复杂工作流的第一步,让系统能够"思考"和做出决策。
2. 合并数据:处理多个数据流
为什么需要合并数据?
当工作流分支后,最终需要将来自不同分支的数据流合并成一个统一的输出。n8n提供了多种方法来实现这一点。
合并数据的三种方法
方法1:使用Merge节点
Merge节点是合并不同数据流的标准工具。它支持多种合并操作:
- Combine:将所有项目从两个流合并为一个数组
- Only New:只保留第一个流中有、第二个流中没有的项目
- Only Existing:只保留两个流中都存在的项目
- Except:保留第一个流中有、第二个流中没有的项目
使用场景:合并来自两个不同来源的数据,如从数据库查询的用户列表和从API获取的活跃用户列表。
方法2:使用Code节点进行复杂合并
对于复杂的数据合并逻辑,Code节点提供了更大的灵活性。它允许你编写自定义的JavaScript或Python代码来合并多个节点的执行结果。
// 从多个节点执行结果中提取数据
const userData = $input.all()[0].json;
const activityData = $input.all()[1].json;
// 合并两个数据对象
return {
user: userData,
activity: activityData,
mergedAt: new Date().toISOString()
};
方法3:Compare Datasets节点进行对比合并
Compare Datasets节点不仅合并数据,还能对比两个数据流。它输出四个不同的流:只在流1中、只在流2中、两者都有、差异数据。
关键点:选择合适的合并方法取决于你的数据结构和业务需求。Merge节点适合简单场景,Code节点适合复杂逻辑,Compare Datasets适合需要数据对比的场景。
3. 循环处理:重复处理多个数据项
n8n中的循环机制
n8n自动处理数据循环。当一个节点接收多个数据项时,它会自动为每个项目执行一次。这意味着你通常不需要显式地编写循环代码。
自动循环示例
假设你需要发送邮件给客户列表中的每个客户:
- 连接客户列表节点到邮件发送节点
- 配置邮件节点
- n8n会自动为列表中的每个客户发送一封邮件
显式循环:Loop Over Items节点
某些情况下,你需要精细控制循环行为:
使用Loop Over Items节点的场景:
- 批量处理:设置
Batch Size为特定数值,分组处理数据 - 避免API速率限制:通过设置小的批量大小,缓解对外部API的压力
- 处理需要特殊逻辑的数据:与IF节点组合,创建条件循环
与条件结合:创建条件循环
Manual Trigger → Loop Over Items → IF Node
├─ True → Process Data
└─ False → Skip
在这个流程中,Loop Over Items会继续迭代直到所有项都被处理,IF节点决定如何处理每个项。
关键点:n8n的循环是自动的,但你可以通过Loop Over Items节点获得更多控制。这让你可以处理复杂的批处理和条件循环场景。
4. 等待:暂停工作流执行
Wait节点的作用
Wait节点允许工作流在执行过程中暂停,然后在满足条件时恢复。这对以下场景非常有用:
- 速率限制:等待一定时间后再调用API,避免超过速率限制
- 异步操作:等待外部事件完成(如Webhook回调)
- 时间触发:在特定时间执行操作
两种等待方式
1. 固定时间等待
工作流暂停特定的时间长度。例如,等待5分钟后继续:
Trigger Node → API Call → Wait 5 minutes → Send Email
2. 等待Webhook事件
工作流保持暂停状态,直到接收到预期的Webhook请求。这对处理异步操作非常有用:
Trigger → Send Approval Request → Wait for Webhook → Process Approval
实际应用
场景:速率限制
假设你需要调用一个API,但它限制每秒最多调用1次。使用Wait节点可以在调用之间插入1秒的延迟:
- 使用Loop Over Items分批处理数据
- 在每次API调用后添加Wait节点,延迟1秒
- 这样可以避免超过API速率限制
关键点:Wait节点是处理时间相关逻辑的关键,使你能够创建智能的、符合外部系统限制的自动化工作流。
5. 子工作流:模块化和重用工作流
什么是子工作流?
子工作流是从另一个工作流(父工作流)中调用的独立工作流。这种模块化方法让你能够:
- 复用逻辑:在多个工作流中重用相同的业务逻辑
- 简化复杂工作流:将大型工作流分解为更小、更易管理的部分
- 改进可维护性:更改一次,所有调用它的工作流都会受益
设置子工作流的步骤
第一步:创建子工作流
- 创建一个新工作流
- 添加Execute Sub-workflow Trigger节点(搜索时也会显示为"When Executed by Another Workflow")
- 配置输入数据模式:
- Define using fields below:定义个别输入字段
- Define using JSON example:提供JSON示例
- Accept all data:接受所有数据
第二步:在父工作流中调用
- 在父工作流中添加Execute Sub-workflow节点
- 选择要调用的子工作流
- 映射输入参数
- 子工作流的最后节点将其输出发送回父工作流
数据流向
Parent Workflow
↓
[Execute Sub-workflow Node] ← 发送数据
↓
Sub-workflow
↓
[Execute Sub-workflow Trigger] ← 接收数据
↓
[Process Nodes]
↓
[Last Node] ← 返回数据
↓
Parent Workflow [Execute Sub-workflow Node] ← 接收结果
↓
Continue execution
子工作流的优势
- 降低执行成本:子工作流执行不计入你的月度执行限额
- 更好的组织:大型自动化系统可以分解为逻辑单元
- 团队协作:不同团队可以维护不同的子工作流
关键点:子工作流是构建可扩展、可维护的n8n自动化系统的关键。使用它们来模块化你的业务逻辑。
6. 错误处理:构建健壮的工作流
错误处理的重要性
即使设计精良的工作流也可能出错。错误处理确保你的自动化系统能够:
- 优雅地处理异常情况
- 通知相关人员问题的发生
- 防止数据丢失或不一致
- 自动恢复或手动干预
创建错误工作流
错误工作流是一个特殊的工作流,当主工作流执行失败时自动触发。
步骤1:创建错误处理工作流
- 创建新工作流,命名为"Error Handler"
- 添加Error Trigger节点作为第一个节点
- 配置错误处理逻辑(如发送Slack通知或Email警报)
- 保存工作流
步骤2:在主工作流中关联错误工作流
- 打开需要错误处理的工作流
- 点击Options → Settings
- 在Error workflow下拉菜单中选择你创建的错误处理工作流
- 保存
Error Trigger接收的数据
Error Trigger节点接收以下错误信息:
{
"execution": {
"id": "执行ID",
"url": "执行的URL",
"retryOf": "重试的执行ID(如果是重试)"
},
"trigger": {
"error": {
"message": "错误消息",
"description": "错误描述"
}
},
"workflow": {
"id": "工作流ID",
"name": "工作流名称"
}
}
主动触发错误:Stop And Error节点
你也可以使用Stop And Error节点在特定条件下强制触发错误:
Check Data → IF Node
├─ Valid → Continue Processing
└─ Invalid → Stop And Error → Error Workflow Triggered
错误处理最佳实践
- 记录错误:将错误信息发送到日志服务或数据库
- 及时通知:通过Slack、Email等渠道通知运维团队
- 自动重试:对于临时错误,配置自动重试机制
- 可追溯性:保留完整的错误追踪信息,便于调试
关键点:好的错误处理是专业工作流的标志。它保证即使发生意外,你也能快速知道并做出响应。
7. 执行顺序:理解多分支工作流的执行流程
n8n中的执行顺序
n8n执行多分支工作流的方式取决于工作流的创建版本:
对于1.0之前创建的工作流
按层级执行:
- 执行第一个分支的所有节点
- 然后执行第二个分支的所有节点
- 依此类推
对于1.0及以后创建的工作流
按分支顺序执行:
- 按画布上从上到下、从左到右的位置顺序执行各分支
- 完全执行一个分支后,才开始执行下一个分支
控制执行顺序
虽然n8n有默认的执行顺序,但你可以在工作流设置中修改它。这对特定的业务需求很有帮助。
执行顺序示例
┌─ Branch A ─┐
Start ──┤ ├─ Merge ─ End
└─ Branch B ─┘
执行顺序:
1. Start节点
2. Branch A的所有节点(按顺序)
3. Branch B的所有节点(按顺序)
4. Merge节点
5. End节点
关键点:了解执行顺序对预测工作流行为至关重要。在某些情况下,你可能需要显式地控制执行顺序来实现特定的业务逻辑。
实战案例:完整的订单处理工作流
现在让我们把所学的所有概念整合在一起,构建一个完整的订单处理工作流。这个工作流展示了条件分支、循环、合并和错误处理的实际应用。
工作流场景
一个电商平台需要自动处理订单:
- 接收订单
- 根据订单金额判断是否需要审批
- 批量发送确认邮件
- 合并处理结果
- 处理任何出现的错误
工作流JSON代码
复制以下JSON代码到n8n中导入(使用菜单中的Import from File或创建新工作流后选择Import from URL):
{
"name": "订单处理工作流",
"nodes": [
{
"parameters": {
"triggerType": "on",
"unit": "minutes",
"value": 5
},
"id": "trigger-node",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"jsonData": "{\n \"orders\": [\n {\"id\": \"ORD001\", \"amount\": 50, \"customer\": \"Alice\", \"email\": \"alice@example.com\"},\n {\"id\": \"ORD002\", \"amount\": 150, \"customer\": \"Bob\", \"email\": \"bob@example.com\"},\n {\"id\": \"ORD003\", \"amount\": 75, \"customer\": \"Charlie\", \"email\": \"charlie@example.com\"}\n ]\n}"
},
"id": "code-input",
"name": "Mock Order Data",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [450, 300]
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "return item.json.orders;"
},
"id": "loop-orders",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 1,
"position": [650, 300]
},
{
"parameters": {
"conditions": {
"boolean": [
{
"value1": "{{ $json.amount }}",
"operation": ">",
"value2": 100
}
]
}
},
"id": "check-amount",
"name": "Check Order Amount",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [850, 300]
},
{
"parameters": {
"content": "订单 {{ $json.id }} 金额为 {{ $json.amount }},需要审批"
},
"id": "approval-note",
"name": "Approval Needed",
"type": "n8n-nodes-base.noOpNode",
"typeVersion": 1,
"position": [1050, 150]
},
{
"parameters": {
"content": "订单 {{ $json.id }} 金额为 {{ $json.amount }},可以直接处理"
},
"id": "direct-process",
"name": "Direct Process",
"type": "n8n-nodes-base.noOpNode",
"typeVersion": 1,
"position": [1050, 450]
},
{
"parameters": {
"content": "订单处理完成"
},
"id": "merge-results",
"name": "Merge Results",
"type": "n8n-nodes-base.merge",
"typeVersion": 2,
"position": [1250, 300]
}
],
"connections": {
"Schedule Trigger": [
{
"node": "Mock Order Data",
"type": "main",
"index": 0
}
],
"Mock Order Data": [
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
],
"Loop Over Items": [
{
"node": "Check Order Amount",
"type": "main",
"index": 0
}
],
"Check Order Amount": [
{
"node": "Approval Needed",
"type": "main",
"index": 0
},
{
"node": "Direct Process",
"type": "main",
"index": 0
}
],
"Approval Needed": [
{
"node": "Merge Results",
"type": "main",
"index": 0
}
],
"Direct Process": [
{
"node": "Merge Results",
"type": "main",
"index": 1
}
]
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
如何使用这个工作流
- 在n8n中创建新工作流
- 点击菜单图标(三个点) → Import from File
- 选择包含上述JSON的文件,或复制JSON内容后使用Import
- 配置各节点参数(如实际的邮件服务凭证)
- 点击Execute Workflow测试
工作流说明
| 节点名称 | 功能 | 关键参数 |
|---|---|---|
| Schedule Trigger | 定时触发,每5分钟执行一次 | 触发间隔 |
| Mock Order Data | 模拟订单数据 | JSON数据 |
| Loop Over Items | 循环处理每个订单 | 批处理大小 |
| Check Order Amount | 根据金额判断是否需要审批 | 条件:amount > 100 |
| Approval Needed | 处理需要审批的订单 | 审批逻辑 |
| Direct Process | 直接处理不需要审批的订单 | 处理逻辑 |
| Merge Results | 合并两个分支的结果 | 合并方式 |
总结
- 条件分支:使用IF和Switch节点根据条件路由数据
- 数据合并:使用Merge节点或Code节点合并多个数据流
- 循环处理:利用n8n的自动循环机制或Loop Over Items节点
- 等待操作:使用Wait节点处理时间相关的业务逻辑
- 子工作流:通过模块化提高代码复用性和可维护性
- 错误处理:创建错误工作流捕获和处理异常
- 执行顺序:理解多分支工作流的执行流程