流程控制节点
Ch08 流程控制节点
真实的工作流不是线性的——数据需要根据条件走不同分支,某些操作需要等待外部事件,还有一些场景需要循环处理。n8n 提供了一套完整的流程控制节点:IF(条件分支)、Switch(多路分支)、Loop Over Items(遍历循环)、Wait(暂停等待)、Merge(流合并)。本章通过实际场景,深入讲解每个节点的配置与使用技巧。
IF 节点:条件分支
IF 节点是最基础的流程控制节点,根据条件判断将数据路由到两个不同的分支:True 输出(条件成立)或 False 输出(条件不成立)。
条件类型
IF 节点支持多种条件类型,可以用 AND/OR 逻辑组合:
- 字符串条件:等于、不等于、包含、不包含、以...开头/结尾、正则匹配
- 数字条件:等于、不等于、大于、小于、大于等于、小于等于
- 布尔条件:是否为 true/false
- 日期条件:在...之前/之后、等于(支持 DateTime 对象)
- 数组条件:包含、不包含某元素
实际示例:根据订单金额路由
// IF 条件配置
{
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "condition-1",
"leftValue": "={{ $json.totalAmount }}",
"rightValue": 1000,
"operator": {
"type": "number",
"operation": "gte"
}
}
],
"combinator": "and"
}
}
- True 分支:大单(金额 ≥ 1000)→ 发送给高级销售团队
- False 分支:普通单 → 进入普通处理队列
Switch 节点:多路分支
当需要根据一个字段的值路由到多个不同分支时,Switch 比多个串联的 IF 节点更清晰。每个分支是一个独立的输出端口。
示例:根据订单状态分发
Switch 配置:
- 字段:{{ $json.status }}
- Output 1:equals "pending" → 待付款处理
- Output 2:equals "paid" → 已付款处理
- Output 3:equals "shipped" → 已发货处理
- Output 4:equals "refunded" → 退款处理
- Fallback(默认) → 未知状态告警
Switch vs IF: IF 节点适合简单的二元判断(是/否)。Switch 适合"一个字段对应多个枚举值"的场景。如果分支逻辑复杂(涉及多个字段的组合判断),推荐用 Code 节点实现自定义路由逻辑。
Loop Over Items 节点:遍历循环
Loop Over Items 节点允许对 items 数组进行循环处理,每次循环传入一个 item。与 n8n 默认的"每个 item 自动分别执行"行为不同,Loop Over Items 提供了更明确的循环控制语义。
常用场景:
- 对每个用户发送个性化邮件(需要等前一封发完再发下一封)
- 串行调用 API(避免并发超过限制)
- 顺序写入数据库(维护插入顺序)
Wait 节点:暂停等待
Wait 节点让工作流在特定位置暂停,等待以下任意一种条件后再继续:
- 时间等待:暂停指定时长(秒/分钟/小时),或等到某个具体时间点
- Webhook 回调:暂停并生成一个唯一的回调 URL,收到 POST 请求后工作流继续
- 表单提交:暂停并生成一个表单 URL,用户填写提交后工作流继续
典型场景:人工审核流程
1. [收到新订单] → [发送审核通知到飞书,附上"批准"按钮链接]
2. Wait 节点(Webhook 模式,超时 24 小时)
3. [审核人点击按钮] → [Wait 节点收到回调,工作流继续]
4. [根据审核结果(按钮携带的参数)执行发货或拒绝]
Wait 节点在 Webhook 模式下生成的回调 URL 格式:
https://your-n8n.com/webhook/[execution-id]/[resume-token]
这个 URL 可以嵌入飞书卡片按钮、邮件链接,或直接发给审核人,他们点击后工作流自动恢复。
示例:带审核的订单处理
// Wait 节点配置(Webhook 模式)
{
"resume": "webhook",
"options": {
"webhookSuffix": "approve-order-{{ $json.orderId }}",
"responseData": "firstEntryJson",
"limit": {
"unit": "hours",
"value": 24
}
}
}
Merge 节点:合并多个输入流
当工作流分叉后需要重新合并时,使用 Merge 节点。它有几种合并模式:
- Append:把所有输入的 items 合并为一个 items 数组(先来的在前)
- Merge By Index:按位置对齐合并,第 1 个输入的 item[0] 与第 2 个输入的 item[0] 合并为一个 item
- Merge By Key:按共同字段值匹配合并(类似 SQL JOIN),如两个流都有
userId字段,则按 userId 对齐
示例:并行获取两个 API 的数据后合并
[用户基础信息 API] → \
Merge (By Key: userId) → [后续处理]
[用户订单数据 API] → /
最佳实践: 合理使用并行分支 + Merge 可以大幅加快工作流执行速度。将互不依赖的 API 调用并行化,然后在 Merge 节点汇合,而不是串行等待每个 API 一一返回。
综合示例:订单审核与分发工作流
结合以上节点,构建一个完整的订单处理流程:
- Webhook Trigger:接收新订单
- IF 节点:金额 ≥ 5000 需要人工审核?
- True:发送审核通知 → Wait 节点(等待审核员点击批准/拒绝)→ Switch 节点(批准/拒绝分支处理)
- False:直接进入自动处理流程
- Switch 节点(订单类型):
- 国内订单 → 调用国内物流 API
- 海外订单 → 调用国际物流 API
- 虚拟商品 → 直接发送激活码
- Merge 节点:汇合所有分支的处理结果
- HTTP Request:更新订单状态 + 发送客户通知