【n8n教程】:掌握n8n流程逻辑,构建复杂自动化工作流

121 阅读3分钟

【n8n教程】:掌握n8n流程逻辑,构建复杂自动化工作流

在n8n中构建自动化工作流时,你不仅需要连接不同的应用程序,还需要根据不同的条件做出决策、处理多个数据流、循环处理数据以及处理可能出现的错误。这正是流程逻辑(Flow Logic)的用武之地。

流程逻辑是n8n中表示复杂业务规则的核心能力。它让你能够构建真实世界的自动化流程,而不仅仅是简单的线性工作流。本教程将帮你快速理解和掌握n8n中的所有流程逻辑概念。

点击获取最新AI资讯、n8n工作流、开发经验分享

1. 条件分支:使用IF节点和Switch节点分割工作流

什么是条件分支?

条件分支允许你根据特定条件将单分支工作流转变为多分支工作流。当数据流经过IF或Switch节点时,系统会根据条件判断,将数据路由到不同的分支进行处理。

核心概念

  • IF节点:最常用的条件节点,支持简单的真/假(True/False)条件判断
  • Switch节点:支持多个条件分支,适合复杂的多路选择场景

实战例子:使用IF节点处理订单

假设你有一个订单管理系统,需要根据订单金额是否超过100来决定是否需要特殊审批:

  1. 添加IF节点,设置条件:{{ $json.orderAmount > 100 }}
  2. 在"True"分支:将订单发送给审批部门
  3. 在"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自动处理数据循环。当一个节点接收多个数据项时,它会自动为每个项目执行一次。这意味着你通常不需要显式地编写循环代码。

自动循环示例

假设你需要发送邮件给客户列表中的每个客户:

  1. 连接客户列表节点到邮件发送节点
  2. 配置邮件节点
  3. n8n会自动为列表中的每个客户发送一封邮件

显式循环:Loop Over Items节点

某些情况下,你需要精细控制循环行为:

使用Loop Over Items节点的场景:

  • 批量处理:设置Batch Size为特定数值,分组处理数据
  • 避免API速率限制:通过设置小的批量大小,缓解对外部API的压力
  • 处理需要特殊逻辑的数据:与IF节点组合,创建条件循环

与条件结合:创建条件循环

Manual Trigger → Loop Over Items → IF Node
                                  ├─ True → Process Data
                                  └─ FalseSkip

在这个流程中,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秒的延迟:

  1. 使用Loop Over Items分批处理数据
  2. 在每次API调用后添加Wait节点,延迟1秒
  3. 这样可以避免超过API速率限制

关键点:Wait节点是处理时间相关逻辑的关键,使你能够创建智能的、符合外部系统限制的自动化工作流。


5. 子工作流:模块化和重用工作流

什么是子工作流?

子工作流是从另一个工作流(父工作流)中调用的独立工作流。这种模块化方法让你能够:

  • 复用逻辑:在多个工作流中重用相同的业务逻辑
  • 简化复杂工作流:将大型工作流分解为更小、更易管理的部分
  • 改进可维护性:更改一次,所有调用它的工作流都会受益

设置子工作流的步骤

第一步:创建子工作流
  1. 创建一个新工作流
  2. 添加Execute Sub-workflow Trigger节点(搜索时也会显示为"When Executed by Another Workflow")
  3. 配置输入数据模式:
    • Define using fields below:定义个别输入字段
    • Define using JSON example:提供JSON示例
    • Accept all data:接受所有数据
第二步:在父工作流中调用
  1. 在父工作流中添加Execute Sub-workflow节点
  2. 选择要调用的子工作流
  3. 映射输入参数
  4. 子工作流的最后节点将其输出发送回父工作流

数据流向

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:创建错误处理工作流
  1. 创建新工作流,命名为"Error Handler"
  2. 添加Error Trigger节点作为第一个节点
  3. 配置错误处理逻辑(如发送Slack通知或Email警报)
  4. 保存工作流
步骤2:在主工作流中关联错误工作流
  1. 打开需要错误处理的工作流
  2. 点击OptionsSettings
  3. Error workflow下拉菜单中选择你创建的错误处理工作流
  4. 保存
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 ErrorError Workflow Triggered

错误处理最佳实践

  1. 记录错误:将错误信息发送到日志服务或数据库
  2. 及时通知:通过Slack、Email等渠道通知运维团队
  3. 自动重试:对于临时错误,配置自动重试机制
  4. 可追溯性:保留完整的错误追踪信息,便于调试

关键点:好的错误处理是专业工作流的标志。它保证即使发生意外,你也能快速知道并做出响应。


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"
  }
}

如何使用这个工作流

  1. 在n8n中创建新工作流
  2. 点击菜单图标(三个点) → Import from File
  3. 选择包含上述JSON的文件,或复制JSON内容后使用Import
  4. 配置各节点参数(如实际的邮件服务凭证)
  5. 点击Execute Workflow测试

工作流说明

节点名称功能关键参数
Schedule Trigger定时触发,每5分钟执行一次触发间隔
Mock Order Data模拟订单数据JSON数据
Loop Over Items循环处理每个订单批处理大小
Check Order Amount根据金额判断是否需要审批条件:amount > 100
Approval Needed处理需要审批的订单审批逻辑
Direct Process直接处理不需要审批的订单处理逻辑
Merge Results合并两个分支的结果合并方式

总结

  1. 条件分支:使用IF和Switch节点根据条件路由数据
  2. 数据合并:使用Merge节点或Code节点合并多个数据流
  3. 循环处理:利用n8n的自动循环机制或Loop Over Items节点
  4. 等待操作:使用Wait节点处理时间相关的业务逻辑
  5. 子工作流:通过模块化提高代码复用性和可维护性
  6. 错误处理:创建错误工作流捕获和处理异常
  7. 执行顺序:理解多分支工作流的执行流程

官方文档

n8n系列教程