【n8n教程】:执行工作流——从手动测试到生产自动化

n8n 工作流执行是 n8n 自动化的心脏。无论你是在开发阶段调试工作流,还是让它在生产环境中自动运行,理解执行的方式至关重要。本教程将带你从零开始,深入掌握 n8n 的各种执行模式、调试技巧,以及如何管理和优化工作流执行。


第一部分:执行基础概念

什么是执行(Execution)?

执行就是工作流的一次运行。每次工作流从开始到结束的完整流程,n8n 都会记录下来。你可以查看每次执行的详细信息,包括数据流、错误信息、执行时长等。

n8n 提供了两种执行模式:

1. 手动执行(Manual Execution)

2. 生产执行(Production Execution)


第二部分:执行列表详解

工作流级别的执行列表

在工作流中选择 Executions 选项卡,你可以看到该工作流的所有执行记录。

如何筛选执行?

  1. 1. 点击 Filters 按钮
  2. 2. 按以下条件筛选:
    • Status(状态):Failed(失败)、Running(运行中)、Success(成功)、Waiting(等待)
    • Execution start(执行开始时间):查看特定时间段的执行
    • Saved custom data(自定义数据):按你在工作流中添加的自定义数据筛选

全局执行列表

在 n8n 首页点击 Executions 选项卡,你可以看到整个 n8n 实例所有工作流的执行记录。这对于监控所有自动化任务非常有用。


第三部分:手动、部分和生产执行的区别

手动执行(Manual Execution)

核心特性:让你在开发过程中快速迭代测试


    
    
    
  优点:
✅ 完整的工作流运行
✅ 实时查看数据流
✅ 支持修改输入数据进行测试
✅ 支持数据钉住功能

使用场景示例

部分执行(Partial Execution)

核心特性:只运行工作流的一部分,而不是整个流程

如何使用

  1. 1. 选择你想执行的节点
  2. 2. 打开其详细视图
  3. 3. 点击 Execute step 按钮
  4. 4. n8n 将执行该节点及其所有前置节点(用以填充该节点的输入数据)

为什么要用部分执行?

常见错误及解决方案

  1. 1. "目标节点未连接任何触发器"
    • • 原因:部分执行需要一个触发器来模拟工作流何时运行
    • • 解决:添加一个手动触发器到你的工作流
  2. 2. "请执行整个工作流,而不是单个节点(现有执行数据过大)"
    • • 原因:工作流分支过多,超过了部分执行允许的消息大小
    • • 解决:使用 Limit 节点限制输出数据量

生产执行(Production Execution)

核心特性:在真实场景中自动运行

配置步骤

  1. 1. 添加一个触发器节点(例如:Schedule、Webhook、On File Event 等)
  2. 2. 将工作流的状态设置为 Active
  3. 3. 工作流现在会根据触发条件自动执行

重要提示


第四部分:重要概念——脏节点(Dirty Nodes)

什么是脏节点?

脏节点是指那些曾经成功执行过,但现在输出数据被认为"过期"或"不可靠"的节点。在画布上,脏节点会显示一个黄色三角形而不是绿色勾号。

n8n 为什么标记节点为脏?

以下操作会导致节点被标记为脏:

如何解决脏节点?

方法很简单——重新执行该节点

你可以:

  1. 1. 点击 Execute step 按钮执行该节点
  2. 2. 或执行整个工作流
  3. 3. 脏状态会自动清除

第五部分:数据钉住(Data Pinning)

什么是数据钉住?

数据钉住让你可以"冻结"某个节点的输出数据。在后续执行中,n8n 会跳过该节点的执行,直接使用钉住的数据继续流程。

为什么要用数据钉住?


    
    
    
  场景1:你在测试一个从 API 获取的大量数据
✅ 第一次执行 API 调用获取数据
✅ 钉住这个数据
✅ 后续执行直接用钉住的数据,不再调用 API
✅ 快速测试后续节点的逻辑,节省时间和 API 配额

场景2:测试复杂的条件分支
✅ 钉住某个中间节点的数据
✅ 快速测试不同的分支逻辑
✅ 无需每次都重新执行前面的所有节点

如何钉住数据?

  1. 1. 在工作流编辑器中选择一个节点
  2. 2. 查看右侧面板的输出数据
  3. 3. 点击 Pin data 按钮
  4. 4. 数据被钉住后,会看到一个图钉图标

重要:生产环境忽略钉住数据

当工作流处于 Active(生产环境)时,所有钉住的数据都会被忽略。只有在手动执行和开发时,钉住的数据才会起作用。


第六部分:调试与重新运行过去的执行

调试失败的生产执行

n8n 提供了强大的调试功能,让你可以在编辑器中重新运行过去的失败执行。

步骤:

  1. 1. 在工作流中打开 Executions 选项卡
  2. 2. 找到你想调试的失败执行
  3. 3. 点击 Debug in editor 按钮
  4. 4. n8n 会:
    • • 将该执行的数据加载到当前工作流
    • • 在第一个节点钉住这些数据
    • • 让你在编辑器中重新运行工作流
  5. 5. 修改工作流逻辑来修复问题
  6. 6. 再次执行测试修复是否有效

重新运行成功的执行

有时你想用之前成功的执行数据来验证新的逻辑:

  1. 1. 在 Executions 列表中选择一个成功的执行
  2. 2. 点击 Copy to editor
  3. 3. 数据会被加载到你的编辑器中
  4. 4. 现在你可以修改工作流并用这些真实数据进行测试

重试失败的执行

有两种重试方式:

方式1:用当前保存的工作流重试

方式2:用原始工作流重试


第七部分:自定义执行数据

什么是自定义执行数据?

你可以在工作流运行时添加自定义元数据,n8n 会将其记录下来。这些数据可以用于:

如何添加自定义执行数据?

使用 Code 节点


    
    
    
  // 添加单条自定义数据
$input.first().item.json.customData = {
  'project'
: 'marketing_campaign',
  'priority'
: 'high'
};

// 或者使用专门的方法

$input.first().item.json.$executionData = {
  'project'
: 'marketing_campaign',
  'priority'
: 'high'
};

限制条件

如何查询自定义数据?

在工作流中使用 Code 节点访问:


    
    
    
  // 获取整个自定义数据对象
const
 customData = $input.first().item.json.$executionData;

// 获取特定值

const
 project = customData.project;

在执行列表中使用

在筛选功能中:

  1. 1. 点击 Filters
  2. 2. 选择 Saved custom data
  3. 3. 输入键和值来筛选
  4. 4. 例如:筛选所有 priorityhigh 的执行

第八部分:调试工具(Debug Feature)

何时使用调试功能?

调试功能特别有用于:

调试流程

  1. 1. 找到失败的执行
  2. 2. 点击 Debug in editor
  3. 3. 工作流会进入"调试模式"
  4. 4. 你可以:
    • • 看到每个节点的输出
    • • 修改节点配置
    • • 单步执行(使用 Execute step)
    • • 修改钉住的数据来测试不同场景

调试技巧


    
    
    
  💡 技巧1:使用 Sticky Note 节点添加注释
✅ 在工作流中记录关键逻辑
✅ 其他人(或未来的自己)可以快速理解

💡 技巧2:分段钉住数据
✅ 在关键节点后钉住数据
✅ 快速定位问题所在

💡 技巧3:使用 Limit 节点
✅ 在测试时限制数据量
✅ 快速执行,节省时间

第九部分:实战案例——完整可执行工作流

案例介绍

我们将创建一个**"天气数据收集器"**工作流,演示以下概念:

工作流说明

这个工作流会:

  1. 1. 定期获取指定城市的天气数据
  2. 2. 添加自定义标签(城市、优先级)
  3. 3. 根据温度条件触发不同的处理逻辑
  4. 4. 记录执行详情

工作流 JSON 代码

将以下代码复制到你的 n8n 中(菜单 → Import from Clipboard):


    
    
    
  {
  "name"
: "Weather Data Collection Workflow",
  "nodes"
: [
    {

      "parameters"
: {
        "trigger"
: "every",
        "unit"
: "minutes",
        "value"
: 30
      }
,
      "id"
: "1",
      "name"
: "Schedule Trigger",
      "type"
: "n8n-nodes-base.scheduleTrigger",
      "typeVersion"
: 1,
      "position"
: [250, 300]
    }
,
    {

      "parameters"
: {
        "method"
: "GET",
        "url"
: "https://api.open-meteo.com/v1/forecast?latitude=31.2304&longitude=120.5954&current=temperature_2m,relative_humidity_2m,weather_code",
        "responseFormat"
: "json"
      }
,
      "id"
: "2",
      "name"
: "Get Weather Data",
      "type"
: "n8n-nodes-base.httpRequest",
      "typeVersion"
: 4.1,
      "position"
: [450, 300],
      "credentials"
: {}
    }
,
    {

      "parameters"
: {
        "mode"
: "runOnceForAllItems",
        "jsCode"
: "return [\n  {\n    ...item.json,\n    temperature: item.json.current.temperature_2m,\n    humidity: item.json.current.relative_humidity_2m,\n    city: 'Suzhou',\n    priority: item.json.current.temperature_2m > 30 ? 'high' : 'normal'\n  }\n]"
      }
,
      "id"
: "3",
      "name"
: "Process Data",
      "type"
: "n8n-nodes-base.code",
      "typeVersion"
: 2,
      "position"
: [650, 300]
    }
,
    {

      "parameters"
: {
        "conditions"
: {
          "nodeVersion"
: 2.1,
          "conditions"
: [
            {

              "value1"
: "={{ $json.temperature }}",
              "value2"
: 30,
              "operator"
: "gt"
            }

          ]

        }

      }
,
      "id"
: "4",
      "name"
: "Temperature Check",
      "type"
: "n8n-nodes-base.if",
      "typeVersion"
: 2,
      "position"
: [850, 200]
    }
,
    {

      "parameters"
: {
        "mode"
: "runOnceForAllItems",
        "jsCode"
: "// 设置自定义执行数据\n$input.first().item.json.$executionData = {\n  'city': 'Suzhou',\n  'alert_type': 'high_temp'\n};\nreturn $input.getAll()"
      }
,
      "id"
: "5",
      "name"
: "Set Custom Data - High Temp",
      "type"
: "n8n-nodes-base.code",
      "typeVersion"
: 2,
      "position"
: [1050, 100]
    }
,
    {

      "parameters"
: {
        "mode"
: "runOnceForAllItems",
        "jsCode"
: "// 设置自定义执行数据\n$input.first().item.json.$executionData = {\n  'city': 'Suzhou',\n  'alert_type': 'normal_temp'\n};\nreturn $input.getAll()"
      }
,
      "id"
: "6",
      "name"
: "Set Custom Data - Normal",
      "type"
: "n8n-nodes-base.code",
      "typeVersion"
: 2,
      "position"
: [1050, 300]
    }

  ]
,
  "connections"
: {
    "Schedule Trigger"
: {
      "main"
: [
        [

          {

            "node"
: "Get Weather Data",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "Get Weather Data"
: {
      "main"
: [
        [

          {

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

        ]

      ]

    }
,
    "Process Data"
: {
      "main"
: [
        [

          {

            "node"
: "Temperature Check",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "Temperature Check"
: {
      "main"
: [
        [

          {

            "node"
: "Set Custom Data - High Temp",
            "type"
: "main",
            "index"
: 0
          }

        ]
,
        [

          {

            "node"
: "Set Custom Data - Normal",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }

  }
,
  "active"
: false,
  "settings"
: {},
  "id"
: "12",
  "meta"
: {
    "instanceId"
: "7d69e7b7a28c89e2d4e5f8c9a1b2c3d4"
  }

}

使用这个工作流的步骤

  1. 1. 导入工作流
    • • 复制上面的 JSON 代码
    • • 在 n8n 中点击"Create Workflow"
    • • 选择"Import from Clipboard"
    • • 粘贴 JSON 代码,点击导入
  2. 2. 测试工作流(手动执行)
    • • 点击"Execute Workflow"按钮
    • • 观察数据流过每个节点
    • • 查看 Process Data 节点的输出,确认温度和湿度正确解析
  3. 3. 测试单个节点(部分执行)
    • • 选择"Get Weather Data"节点
    • • 点击"Execute step"
    • • 查看 API 返回的原始数据
    • • 无需重新请求 API,快速迭代测试
  4. 4. 查看执行历史
    • • 点击"Executions"选项卡
    • • 过滤查看不同的执行
    • • 点击某个执行,查看自定义数据标记
  5. 5. 激活生产模式
    • • 确保工作流配置正确
    • • 点击工作流名称旁边的"Active"开关
    • • 工作流现在会每 30 分钟自动运行一次
    • • 在 Executions 选项卡中实时监控执行

工作流详解

节点作用执行模式
Schedule Trigger每 30 分钟触发一次触发器
Get Weather Data调用开放天气 APIHTTP 请求
Process Data提取并转换数据Code 节点
Temperature Check根据温度分支处理IF 条件
Set Custom Data添加自定义标签Code 节点

快速参考表

功能使用场景快捷键/方式
手动执行开发测试点击"Execute Workflow"按钮
部分执行快速测试单个节点选择节点 → 点击"Execute step"
数据钉住冻结节点输出点击"Pin data"按钮
调试执行排查生产故障Executions → 点击"Debug in editor"
重试执行重新运行失败任务Executions → 点击"Retry execution"
自定义数据标记和筛选执行在 Code 节点中设置 $executionData
脏节点清理清除过期数据标记执行该节点或整个工作流

常见问题解答

Q1:手动执行和生产执行的数据会混在一起吗?

A:不会。n8n 会分别记录所有执行,但在 Executions 列表中都能看到。你可以通过时间戳和其他信息区分。

Q2:钉住的数据在生产环境中不会被使用,这是为什么?

A:为了确保生产稳定性。生产环境必须始终从真实的触发条件开始执行,而不是依赖你在开发时钉住的测试数据。

Q3:如何快速找到失败的执行?

A:使用 Filters 功能:

  1. 1. 打开 Executions 选项卡
  2. 2. 点击 Filters
  3. 3. 选择 Status = Failed
  4. 4. 可选:添加时间范围过滤

Q4:能否在工作流中访问当前的执行 ID?

A:可以的,使用特殊变量 $execution.id。例如在 Code 节点中:


    
    
    
  const executionId = $execution.id;

Q5:脏节点会影响生产执行吗?

A:不会。脏节点标记是针对开发环境的。生产执行按照当前保存的工作流配置完整运行,不受脏节点标记影响。


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

引用链接

[1] 官方文档: https://docs.n8n.io/workflows/executions/
[2] n8n 系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#