在n8n中构建自动化工作流时,你不仅需要连接不同的应用程序,还需要根据不同的条件做出决策、处理多个数据流、循环处理数据以及处理可能出现的错误。这正是流程逻辑(Flow Logic)的用武之地。
流程逻辑是n8n中表示复杂业务规则的核心能力。它让你能够构建真实世界的自动化流程,而不仅仅是简单的线性工作流。本教程将帮你快速理解和掌握n8n中的所有流程逻辑概念。
条件分支允许你根据特定条件将单分支工作流转变为多分支工作流。当数据流经过IF或Switch节点时,系统会根据条件判断,将数据路由到不同的分支进行处理。
假设你有一个订单管理系统,需要根据订单金额是否超过100来决定是否需要特殊审批:
{{ $json.orderAmount > 100 }}当你有多个条件需要判断时,Switch节点比多个IF节点更简洁。例如,根据订单状态(待处理、已发货、已完成)执行不同的操作。
关键点:条件分支是构建复杂工作流的第一步,让系统能够"思考"和做出决策。
当工作流分支后,最终需要将来自不同分支的数据流合并成一个统一的输出。n8n提供了多种方法来实现这一点。
Merge节点是合并不同数据流的标准工具。它支持多种合并操作:
使用场景:合并来自两个不同来源的数据,如从数据库查询的用户列表和从API获取的活跃用户列表。
对于复杂的数据合并逻辑,Code节点提供了更大的灵活性。它允许你编写自定义的JavaScript或Python代码来合并多个节点的执行结果。
// 从多个节点执行结果中提取数据
const userData = $input.all()[0].json;
const activityData = $input.all()[1].json;
// 合并两个数据对象
return {
user: userData,
activity: activityData,
mergedAt: new Date().toISOString()
};Compare Datasets节点不仅合并数据,还能对比两个数据流。它输出四个不同的流:只在流1中、只在流2中、两者都有、差异数据。
关键点:选择合适的合并方法取决于你的数据结构和业务需求。Merge节点适合简单场景,Code节点适合复杂逻辑,Compare Datasets适合需要数据对比的场景。
n8n自动处理数据循环。当一个节点接收多个数据项时,它会自动为每个项目执行一次。这意味着你通常不需要显式地编写循环代码。
假设你需要发送邮件给客户列表中的每个客户:
某些情况下,你需要精细控制循环行为:
使用Loop Over Items节点的场景:
Batch Size为特定数值,分组处理数据Manual Trigger → Loop Over Items → IF Node
├─ True → Process Data
└─ False → Skip在这个流程中,Loop Over Items会继续迭代直到所有项都被处理,IF节点决定如何处理每个项。
关键点:n8n的循环是自动的,但你可以通过Loop Over Items节点获得更多控制。这让你可以处理复杂的批处理和条件循环场景。
Wait节点允许工作流在执行过程中暂停,然后在满足条件时恢复。这对以下场景非常有用:
工作流暂停特定的时间长度。例如,等待5分钟后继续:
Trigger Node → API Call → Wait 5 minutes → Send Email工作流保持暂停状态,直到接收到预期的Webhook请求。这对处理异步操作非常有用:
Trigger → Send Approval Request → Wait for Webhook → Process Approval场景:速率限制
假设你需要调用一个API,但它限制每秒最多调用1次。使用Wait节点可以在调用之间插入1秒的延迟:
关键点:Wait节点是处理时间相关逻辑的关键,使你能够创建智能的、符合外部系统限制的自动化工作流。
子工作流是从另一个工作流(父工作流)中调用的独立工作流。这种模块化方法让你能够:
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自动化系统的关键。使用它们来模块化你的业务逻辑。
即使设计精良的工作流也可能出错。错误处理确保你的自动化系统能够:
错误工作流是一个特殊的工作流,当主工作流执行失败时自动触发。
Error Trigger节点接收以下错误信息:
{
"execution": {
"id": "执行ID",
"url": "执行的URL",
"retryOf": "重试的执行ID(如果是重试)"
},
"trigger": {
"error": {
"message": "错误消息",
"description": "错误描述"
}
},
"workflow": {
"id": "工作流ID",
"name": "工作流名称"
}
}你也可以使用Stop And Error节点在特定条件下强制触发错误:
Check Data → IF Node
├─ Valid → Continue Processing
└─ Invalid → Stop And Error → Error Workflow Triggered关键点:好的错误处理是专业工作流的标志。它保证即使发生意外,你也能快速知道并做出响应。
n8n执行多分支工作流的方式取决于工作流的创建版本:
按层级执行:
按分支顺序执行:
虽然n8n有默认的执行顺序,但你可以在工作流设置中修改它。这对特定的业务需求很有帮助。
┌─ Branch A ─┐
Start ──┤ ├─ Merge ─ End
└─ Branch B ─┘
执行顺序:
1. Start节点
2. Branch A的所有节点(按顺序)
3. Branch B的所有节点(按顺序)
4. Merge节点
5. End节点关键点:了解执行顺序对预测工作流行为至关重要。在某些情况下,你可能需要显式地控制执行顺序来实现特定的业务逻辑。
现在让我们把所学的所有概念整合在一起,构建一个完整的订单处理工作流。这个工作流展示了条件分支、循环、合并和错误处理的实际应用。
一个电商平台需要自动处理订单:
复制以下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"
}
}| 节点名称 | 功能 | 关键参数 |
|---|---|---|
| Schedule Trigger | 定时触发,每5分钟执行一次 | 触发间隔 |
| Mock Order Data | 模拟订单数据 | JSON数据 |
| Loop Over Items | 循环处理每个订单 | 批处理大小 |
| Check Order Amount | 根据金额判断是否需要审批 | 条件:amount > 100 |
| Approval Needed | 处理需要审批的订单 | 审批逻辑 |
| Direct Process | 直接处理不需要审批的订单 | 处理逻辑 |
| Merge Results | 合并两个分支的结果 | 合并方式 |
[1] 官方文档: https://docs.n8n.io/flow-logic/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#