本教程带你从零开始理解n8n中最强大的模块化特性——Execute Sub-workflow Trigger节点。通过这个节点,你可以轻松实现工作流的复用、模块化设计和团队协作。无论你是初学者还是有经验的自动化工程师,这篇教程都会让你掌握核心技能!
在n8n中,子工作流是指能被其他工作流调用的独立工作流。这就像编写可复用的代码函数一样——你可以在多个地方调用同一个子工作流,而不需要重复编写相同的逻辑。
| 优势 | 说明 |
|---|---|
| 代码复用 | 一次编写,多次使用。同一个数据处理逻辑可以被多个工作流调用 |
| 模块化设计 | 将复杂的大工作流拆分成多个小工作流,提高可维护性 |
| 团队协作 | 不同团队成员可以开发独立的子工作流,然后组合使用 |
| 易于测试 | 小的子工作流更容易进行隔离测试和调试 |
| 降低出错率 | 减少代码重复,从而减少出错的可能性 |
想象你有以下场景:
你会发现"数据格式化 → 数据验证"这两个步骤是重复的。通过使用子工作流,你只需要写一次这个流程,然后在3个场景中都调用它!
Execute Sub-workflow Trigger节点(也叫"When Executed by Another Workflow")是子工作流的入口点,必须放在子工作流的最开始。
当其他工作流调用我时,我就启动!
当你创建子工作流时,Execute Sub-workflow Trigger节点需要定义如何处理输入数据。n8n提供了三种模式:
含义:你需要手动定义每个输入字段的名称和类型。
何时使用:
配置步骤:
示例代码:
// 定义的字段:
// customerName (string) - 必需
// orderAmount (number) - 必需
// email (string) - 可选
// 父工作流调用时必须提供:
// {{ $json.customerName }}
// {{ $json.orderAmount }}含义:你提供一个JSON示例,系统根据这个示例推断数据类型。
何时使用:
配置步骤:
示例JSON:
{
"customerName": "Alice",
"orderAmount": 200,
"items": [
{
"productId": "123",
"quantity": 2
}
],
"shippingAddress": {
"city": "Beijing",
"country": "China"
}
}含义:无条件接受所有数据,不做任何检查。
何时使用:
⚠️ 注意:
这种模式灵活但容易出错。子工作流需要自己处理数据类型检查。

我们将构建一个简单的订单处理流程:
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",添加两个字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| customerName | string | 客户名称 |
| orderAmount | number | 订单金额 |
配置界面:
Input Data Mode: Define using fields below
Field 1:
Name: customerName
Type: string
Required: Yes
Field 2:
Name: orderAmount
Type: number
Required: Yes4. 添加数据处理节点(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中:
{
"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
}
]
]
}
}
}{
"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
}
]
]
}
}
}步骤1:复制上面的JSON代码
步骤2:在n8n中新建工作流
步骤3:点击右上角"..."菜单 → 选择"Import from File"或"Import from URL"
步骤4:粘贴JSON代码
步骤5:点击"Import",工作流就会自动创建!
1. 获取Webhook URL
在父工作流中,点击Webhook节点
复制生成的URL,例如:
https://your-n8n-instance.com/webhook/orders2. 使用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. 检查Execute Sub-workflow Trigger中的Input Data Mode设置
2. 确保定义的字段名称与父工作流中映射的名称完全一致
3. 可以尝试改用"Accept all data"模式快速测试
4. 如果还是不行,尝试在子工作流的Trigger节点上"Pin example data"原因:
解决方案:
1. 检查子工作流的所有节点是否有红色错误标记
2. 点击每个节点运行测试,查看具体错误信息
3. 检查表达式中的变量名是否正确
4. 确保所有依赖的API凭证已正确配置
5. 子工作流必须没有任何错误才能被父工作流调用原因:
解决方案:
1. 检查子工作流中最后一个节点的输出
2. 运行该节点查看输出数据结构
3. 在父工作流的Execute Sub-workflow节点查看"View sub-execution"查看完整日志
4. 确保返回的数据格式正确原因:默认情况下,Execute Sub-workflow一次只处理一条数据
解决方案:
使用SplitInBatches节点将数据分割后逐一处理:
数据来源 → SplitInBatches → Execute Sub-workflow → 合并结果当你在编辑子工作流时,无法看到实时数据,这时可以使用"Pin example data"功能:
1. 在Execute Sub-workflow Trigger节点上点击"Fetch test event"
2. 或者在第一次运行父工作流后,这个数据会被自动保存
3. 点击节点的"..."菜单,选择"Pin example data"
4. 从过去的执行中选择一个样本数据
5. 现在编辑子工作流时就能看到实时数据了!Execute Sub-workflow节点有一个重要选项:"Wait for sub-workflow"
- 启用:父工作流等待子工作流完成后再继续(默认)
- 禁用:父工作流不等待子工作流完成就继续执行(用于异步操作)
使用场景:
- 启用:需要子工作流返回数据的情况
- 禁用:只需要触发子工作流,不需要结果的情况为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] 官方文档: 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#