【n8n教程】:Execute Sub-workflow Trigger节点,让你的工作流高效复用!

本教程带你从零开始理解n8n中最强大的模块化特性——Execute Sub-workflow Trigger节点。通过这个节点,你可以轻松实现工作流的复用、模块化设计和团队协作。无论你是初学者还是有经验的自动化工程师,这篇教程都会让你掌握核心技能!


什么是Sub-workflow(子工作流)?

在n8n中,子工作流是指能被其他工作流调用的独立工作流。这就像编写可复用的代码函数一样——你可以在多个地方调用同一个子工作流,而不需要重复编写相同的逻辑。

🎯 为什么要使用子工作流?

优势说明
代码复用一次编写,多次使用。同一个数据处理逻辑可以被多个工作流调用
模块化设计将复杂的大工作流拆分成多个小工作流,提高可维护性
团队协作不同团队成员可以开发独立的子工作流,然后组合使用
易于测试小的子工作流更容易进行隔离测试和调试
降低出错率减少代码重复,从而减少出错的可能性

📚 实际场景例子

想象你有以下场景:

你会发现"数据格式化 → 数据验证"这两个步骤是重复的。通过使用子工作流,你只需要写一次这个流程,然后在3个场景中都调用它!


核心概念:Execute Sub-workflow Trigger是什么?

Execute Sub-workflow Trigger节点(也叫"When Executed by Another Workflow")是子工作流的入口点,必须放在子工作流的最开始。


    
    
    
  当其他工作流调用我时,我就启动!

🔑 它的作用:

  1. 1. 接收数据:从父工作流接收传入的数据
  2. 2. 定义数据结构:告诉系统"我期望接收什么样的数据"
  3. 3. 触发子工作流:当父工作流调用我时,自动启动

三种数据输入模式详解

当你创建子工作流时,Execute Sub-workflow Trigger节点需要定义如何处理输入数据。n8n提供了三种模式:

1️⃣ Define using fields below(推荐初学者使用)

含义:你需要手动定义每个输入字段的名称和类型。

何时使用

配置步骤

  1. 1. 在节点中选择"Define using fields below"
  2. 2. 点击"Add Field"添加字段
  3. 3. 为每个字段指定名称和类型(string、number、boolean等)
  4. 4. 配置是否必需

示例代码


    
    
    
  // 定义的字段:
// customerName (string) - 必需

// orderAmount (number) - 必需

// email (string) - 可选


// 父工作流调用时必须提供:

// {{ $json.customerName }}

// {{ $json.orderAmount }}

2️⃣ Define using JSON example

含义:你提供一个JSON示例,系统根据这个示例推断数据类型。

何时使用

配置步骤

  1. 1. 选择"Define using JSON example"
  2. 2. 粘贴一个完整的JSON样本
  3. 3. 系统会自动推断字段名和类型

示例JSON


    
    
    
  {
  "customerName"
: "Alice",
  "orderAmount"
: 200,
  "items"
: [
    {

      "productId"
: "123",
      "quantity"
: 2
    }

  ]
,
  "shippingAddress"
: {
    "city"
: "Beijing",
    "country"
: "China"
  }

}

3️⃣ Accept all data

含义:无条件接受所有数据,不做任何检查。

何时使用

⚠️ 注意
这种模式灵活但容易出错。子工作流需要自己处理数据类型检查。

三种输入数据模式对比
三种输入数据模式对比

实战:逐步构建你的第一个子工作流

🎬 实战项目:订单处理系统

我们将构建一个简单的订单处理流程:

第一步:创建子工作流

1. 新建工作流


    
    
    
  点击 "Create Workflow" → 输入名称 "Process Order"

2. 添加Execute Sub-workflow Trigger节点


    
    
    
  点击 "Add node" → 搜索 "execute sub workflow trigger"
或搜索 "when executed by another workflow"

3. 配置输入数据
选择"Define using fields below",添加两个字段:

字段名类型说明
customerNamestring客户名称
orderAmountnumber订单金额

配置界面


    
    
    
  Input Data Mode: Define using fields below

Field 1:
  Name: customerName
  Type: string
  Required: Yes

Field 2:
  Name: orderAmount
  Type: number
  Required: Yes

4. 添加数据处理节点(Set节点)


    
    
    
  点击 "Add node" → 搜索 "set" → 选择 "Set"

配置Set节点来计算税金和总额:


    
    
    
  // 在Set节点中添加以下字段:

// 1. 复制客户名称

Name
: customerName
Value
: {{ $json.customerName }}

// 2. 复制订单金额

Name
: orderAmount
Value
: {{ $json.orderAmount }}

// 3. 计算税金(假设10%税率)

Name
: taxAmount
Value
: {{ $json.orderAmount * 0.1 }}

// 4. 计算总额

Name
: totalAmount
Value
: {{ $json.orderAmount + ($json.orderAmount * 0.1) }}

// 5. 添加处理时间戳

Name
: processedAt
Value
: {{ new Date().toISOString() }}

5. 保存子工作流


    
    
    
  点击右上角 "Save"
记下工作流ID(在URL末尾可以看到)

第一步完成:你的子工作流已经准备好了!


第二步:创建父工作流

1. 新建工作流


    
    
    
  点击 "Create Workflow" → 输入名称 "Handle Orders"

2. 添加Webhook触发节点


    
    
    
  点击 "Add node" → 搜索 "webhook" → 选择"Webhook"

配置Webhook


    
    
    
  Method: POST
Path: orders
(这样你就可以通过 POST https://your-n8n-instance/webhook/orders 来触发)

3. 添加Execute Sub-workflow节点


    
    
    
  点击 "Add node" → 搜索 "execute" → 选择"Execute Sub-workflow"

重要配置


    
    
    
  Sub-workflow selection:
  Database: 选择你的数据库
  From list: 选择 "Process Order"(刚才创建的子工作流)

Input mapping(输入映射):
  customerName → {{ $json.customerName }}
  orderAmount → {{ $json.orderAmount }}

4. 添加后续处理节点(可选)

比如,你可以添加:

5. 保存并激活


    
    
    
  点击 "Save"
点击 "Activate" 激活工作流

第二步完成:父工作流已准备好调用子工作流!


📡 完整的可执行工作流代码

以下是完整的工作流JSON代码,你可以直接导入到n8n中:

子工作流JSON代码(Process Order)


    
    
    
  {
  "name"
: "Process Order",
  "nodes"
: [
    {

      "parameters"
: {
        "mode"
: "define"
      }
,
      "id"
: "1",
      "name"
: "When Executed by Another Workflow",
      "type"
: "n8n-nodes-base:executeworkflowtrigger",
      "typeVersion"
: 1,
      "position"
: [250, 300]
    }
,
    {

      "parameters"
: {
        "assignments"
: {
          "assignments"
: [
            {

              "id"
: "a1",
              "name"
: "customerName",
              "value"
: "={{ $json.customerName }}",
              "type"
: "string"
            }
,
            {

              "id"
: "a2",
              "name"
: "orderAmount",
              "value"
: "={{ $json.orderAmount }}",
              "type"
: "number"
            }
,
            {

              "id"
: "a3",
              "name"
: "taxAmount",
              "value"
: "={{ $json.orderAmount * 0.1 }}",
              "type"
: "number"
            }
,
            {

              "id"
: "a4",
              "name"
: "totalAmount",
              "value"
: "={{ $json.orderAmount + ($json.orderAmount * 0.1) }}",
              "type"
: "number"
            }
,
            {

              "id"
: "a5",
              "name"
: "processedAt",
              "value"
: "={{ new Date().toISOString() }}",
              "type"
: "string"
            }

          ]

        }

      }
,
      "id"
: "2",
      "name"
: "Set Data",
      "type"
: "n8n-nodes-base:set",
      "typeVersion"
: 3,
      "position"
: [450, 300]
    }

  ]
,
  "connections"
: {
    "When Executed by Another Workflow"
: {
      "main"
: [
        [

          {

            "node"
: "Set Data",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }

  }

}

父工作流JSON代码(Handle Orders)


    
    
    
  {
  "name"
: "Handle Orders",
  "nodes"
: [
    {

      "parameters"
: {
        "path"
: "orders",
        "method"
: "POST"
      }
,
      "id"
: "1",
      "name"
: "Webhook",
      "type"
: "n8n-nodes-base:webhook",
      "typeVersion"
: 1,
      "position"
: [250, 300]
    }
,
    {

      "parameters"
: {
        "workflowId"
: "PROCESS_ORDER_WORKFLOW_ID",
        "inputDataMode"
: "defineBelow",
        "inputs"
: {
          "fields"
: [
            {

              "name"
: "customerName",
              "type"
: "string",
              "value"
: "={{ $json.customerName }}"
            }
,
            {

              "name"
: "orderAmount",
              "type"
: "number",
              "value"
: "={{ $json.orderAmount }}"
            }

          ]

        }

      }
,
      "id"
: "2",
      "name"
: "Execute Process Order",
      "type"
: "n8n-nodes-base:executeworkflow",
      "typeVersion"
: 1,
      "position"
: [450, 300]
    }

  ]
,
  "connections"
: {
    "Webhook"
: {
      "main"
: [
        [

          {

            "node"
: "Execute Process Order",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }

  }

}

📥 如何导入这些代码到n8n?

步骤1:复制上面的JSON代码

步骤2:在n8n中新建工作流

步骤3:点击右上角"..."菜单 → 选择"Import from File"或"Import from URL"

步骤4:粘贴JSON代码

步骤5:点击"Import",工作流就会自动创建!


🧪 测试你的工作流

使用Postman或cURL测试

1. 获取Webhook URL


    
    
    
  在父工作流中,点击Webhook节点
复制生成的URL,例如:
https://your-n8n-instance.com/webhook/orders

2. 使用cURL发送请求


    
    
    
  curl -X POST https://your-n8n-instance.com/webhook/orders \
  -H "Content-Type: application/json" \
  -d '{
    "customerName": "Alice",
    "orderAmount": 200
  }'

3. 使用Postman


    
    
    
  1. 打开Postman
2. 选择 POST 方法
3. 输入URL:https://your-n8n-instance.com/webhook/orders
4. 在Body选项卡中选择 "raw" → "JSON"
5. 输入请求数据:
{
  "customerName": "Alice",
  "orderAmount": 200
}
6. 点击"Send"

预期结果


    
    
    
  {
  "customerName"
: "Alice",
  "orderAmount"
: 200,
  "taxAmount"
: 20,
  "totalAmount"
: 220,
  "processedAt"
: "2024-12-02T10:30:45.123Z"
}

⚠️ 常见问题与解决方案

❌ 问题1:子工作流中看不到父工作流传来的数据

原因

解决方案


    
    
    
  1. 检查Execute Sub-workflow Trigger中的Input Data Mode设置
2. 确保定义的字段名称与父工作流中映射的名称完全一致
3. 可以尝试改用"Accept all data"模式快速测试
4. 如果还是不行,尝试在子工作流的Trigger节点上"Pin example data"

❌ 问题2:子工作流有错误,导致父工作流无法调用

原因

解决方案


    
    
    
  1. 检查子工作流的所有节点是否有红色错误标记
2. 点击每个节点运行测试,查看具体错误信息
3. 检查表达式中的变量名是否正确
4. 确保所有依赖的API凭证已正确配置
5. 子工作流必须没有任何错误才能被父工作流调用

❌ 问题3:数据没有正确返回给父工作流

原因

解决方案


    
    
    
  1. 检查子工作流中最后一个节点的输出
2. 运行该节点查看输出数据结构
3. 在父工作流的Execute Sub-workflow节点查看"View sub-execution"查看完整日志
4. 确保返回的数据格式正确

❌ 问题4:如何让多个数据项通过Execute Sub-workflow节点?

原因:默认情况下,Execute Sub-workflow一次只处理一条数据

解决方案
使用SplitInBatches节点将数据分割后逐一处理:


    
    
    
  数据来源 → SplitInBatches → Execute Sub-workflow → 合并结果

💡 进阶技巧

技巧1:调试技巧 - Pin Example Data

当你在编辑子工作流时,无法看到实时数据,这时可以使用"Pin example data"功能:


    
    
    
  1. 在Execute Sub-workflow Trigger节点上点击"Fetch test event"
2. 或者在第一次运行父工作流后,这个数据会被自动保存
3. 点击节点的"..."菜单,选择"Pin example data"
4. 从过去的执行中选择一个样本数据
5. 现在编辑子工作流时就能看到实时数据了!

技巧2:性能优化 - Wait For Sub-workflow


    
    
    
  Execute Sub-workflow节点有一个重要选项:"Wait for sub-workflow"
- 启用:父工作流等待子工作流完成后再继续(默认)
- 禁用:父工作流不等待子工作流完成就继续执行(用于异步操作)

使用场景:
- 启用:需要子工作流返回数据的情况
- 禁用:只需要触发子工作流,不需要结果的情况

技巧3:错误处理


    
    
    
  为Execute Sub-workflow节点添加error handler:
1. 右键点击节点
2. 选择"Add error handler"
3. 配置错误处理流程,比如发送告警邮件

📚 总结

概念说明使用场景
Sub-workflow可被其他工作流调用的独立工作流工作流复用、模块化设计
Execute Sub-workflow Trigger子工作流的入口节点每个子工作流必须有一个
Execute Sub-workflow父工作流中的调用节点从父工作流调用子工作流
Input Data Mode定义子工作流的输入数据格式保证数据类型安全
Data Mapping将父工作流的数据映射到子工作流实现工作流间的数据传递
Wait for Sub-workflow是否等待子工作流完成同步/异步执行控制

官方文档[1]
n8n系列教程[2]

引用链接

[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflowtrigger/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#