【n8n教程】:Wait 节点,让你的工作流优雅地暂停和恢复

在工作流自动化中,有时候你不需要立即执行下一步操作,而是需要等待某个时间段过去等待外部信号到达,或者让用户做出决策。这就是 Wait 节点 的用武之地。

Wait 节点是 n8n 中最强大的控制流工具之一,它能让你的工作流在适当的时刻执行,而不是盲目地一路狂奔。从 API 速率限制到人工审批流程,再到定时跟进邮件——Wait 节点无处不在。


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

Wait 节点的核心概念

什么是 Wait 节点?

Wait 节点是一个暂停节点。当工作流执行到这个节点时,它会:

  1. 暂停执行 —— 停止继续执行后续节点
  2. 保存状态 —— 将执行数据卸载到数据库中保存
  3. 等待条件 —— 直到满足特定的恢复条件
  4. 恢复执行 —— 条件满足时,从保存的状态继续执行

这种机制使得 n8n 可以高效地处理长时间运行的工作流,而不会占用过多的服务器资源。


Wait 节点的四种恢复模式

1. 时间间隔后恢复(After Time Interval)

最直观的暂停方式——等待固定的时间段。

配置参数:

  • Wait Amount:输入等待时间数值(如 5、24、7)
  • Wait Unit:选择时间单位(秒、分钟、小时、天)

常见场景:

  • ⏰ 发送初始邮件后,等待 7 天再发送跟进邮件
  • ⏰ 提交表单后,等待 24 小时再发送确认邮件
  • ⏰ 调用 API 后,等待 5 秒让服务器处理数据

小贴士: 对于少于 65 秒的等待时间,n8n 不会将执行数据卸载到数据库,而是直接在内存中等待。


2. 指定时间恢复(At Specified Time)

不是等待一段时间,而是指定一个具体的日期和时间,到了那个时刻才继续。

配置参数:

  • Date and Time:使用日期选择器设置具体的恢复时间

常见场景:

  • 📅 工作流只在工作时间内执行
  • 📅 定时在特定日期触发某个操作
  • 📅 确保所有操作都在营业时间内完成

3. Webhook 调用时恢复(On Webhook Call)

这是最灵活的模式——等待来自外部系统的信号

工作流会生成一个唯一的 Webhook URL(存储在 $execution.resumeUrl 变量中),当这个 URL 被调用时,工作流才会恢复。

高级参数:

参数 说明
Authentication 选择认证方式(Basic Auth、Header Auth、JWT、None)
HTTP Method 选择 HTTP 方法(GET、POST、PUT 等)
Response Code 返回的响应状态码(200、201、400 等)
Response Data 返回的数据格式(All Entries、First Entry JSON 等)
IP(s) Whitelist 限制哪些 IP 地址可以调用这个 Webhook
Limit Wait Time 设置最大等待时限,超时后自动恢复

常见场景:

  • 🔗 将数据发送到第三方服务,等待服务处理完后返回结果
  • 🔗 构建人工审批流程,经理点击邮件中的链接来批准或拒绝
  • 🔗 处理异步任务,比如等待文件上传或处理完成

4. 表单提交时恢复(On Form Submitted)

等待用户提交一个表单,表单数据会成为工作流的下一步输入。

表单配置:

配置项 说明
Form Title 表单顶部显示的标题
Form Description 表单下方的描述文本
Form Fields 表单包含的字段列表

字段类型支持:

  • 📝 文本框(Text)
  • 🔤 长文本(Textarea)
  • 🔢 数字(Number)
  • 📅 日期(Date)
  • 🔐 密码(Password)
  • ✅ 下拉列表(Dropdown List)
  • ☑️ 多选框(Multiple Choice)

常见场景:

  • ✅ 人工审批工作流——经理提交批准/拒绝表单
  • ✅ 收集用户反馈
  • ✅ 多步骤注册流程

实战教程:构建你的第一个 Wait 工作流

场景设定

构建一个邮件跟进系统

  1. 用户注册后立即发送欢迎邮件
  2. 等待 3 天
  3. 发送跟进邮件

逐步构建

步骤 1:添加触发器

拖拽一个 Webhook 节点作为触发器,这代表用户注册事件。

配置示例:

  • 设置为 GETPOST 方法
  • 记住生成的 Webhook URL
步骤 2:发送欢迎邮件

添加一个 Send Email 节点

  • To{{ $json.email }}
  • Subject欢迎加入我们!
  • Body:提供有价值的初始内容
步骤 3:添加 Wait 节点

拖拽 Wait 节点

  • Resume condition:选择 After Time Interval
  • Wait Amount:输入 3
  • Wait Unit:选择 Days
步骤 4:发送跟进邮件

再添加一个 Send Email 节点

  • To{{ $json.email }}
  • Subject不要错过!您的专属优惠仅剩 24 小时
  • Body:发送第二次价值提议
步骤 5:测试工作流
  1. 点击 Test Workflow 按钮
  2. 工作流会立即发送欢迎邮件
  3. 工作流执行会显示为 “等待中”
  4. 3 天后,n8n 会自动恢复并发送跟进邮件

高级使用场景

场景 1:条件性等待与人工审批

触发器(表单提交)
  ↓
业务逻辑处理
  ↓
生成审批表单(Wait 节点)
  ↓
根据审批结果分支处理
  ├→ 批准 → 发送确认邮件 → 更新数据库
  └→拒绝 → 发送拒绝邮件 → 记录日志

Wait 节点配置:

  • Resume condition:On Form Submitted
  • 表单字段:添加 “Decision”(下拉列表,选项:Approve/Reject)
  • Limit Wait Time:启用,设置为 7 天(如果超期没人批准,自动拒绝)

场景 2:API 速率限制控制

许多 API 有请求限制(如每分钟 60 个请求)。使用 Wait 节点可以优雅地控制请求速率。

Get Contacts(获取 100 个联系人)
  ↓
Loop Through Contacts
  ├→ Send API Request(每个请求)
  ├→ Wait 1 Second
  └→ 重复直到完成

这样可以将 100 个请求平铺到 100 秒,避免触发 API 限制。

场景 3:多级审批流程

提交单据
  ↓
Level 1 审批(Wait + 表单)
  ↓
Level 2 审批(Wait + 表单)
  ↓
Level 3 审批(Wait + 表单)
  ↓
执行操作

每个 Wait 节点都会生成一个独立的表单 URL,可以并行或顺序发给不同的审批人。


常见问题解答

Q1: Wait 节点暂停时,工作流数据会丢失吗?

A: 不会。n8n 会将执行数据自动保存到数据库中。当工作流恢复时,所有数据都会完整加载回来,你可以继续使用 {{ $json }} 引用原始数据。

Q2: 如何在 Webhook 恢复时传递自定义数据?

A: 调用 Webhook URL 时,可以在 URL 参数或请求体中包含数据:

GET: https://...resumeWebhookUrl?status=approved&comment=looks_good

POST: {
  "status": "approved",
  "comment": "Looks good!",
  "timestamp": "2025-01-15T10:30:00Z"
}

后续节点可以通过 {{ $json.status }}{{ $json.comment }} 访问这些数据。

Q3: Wait 节点设置的超时时间不准确怎么办?

A: 这通常是时区问题。n8n 始终使用服务器时区,而不是工作流的时区设置。如果工作流配置了时区,改变时区设置不会影响已有的 Wait 节点等待时间。

Q4: 能否在一个工作流中使用多个 Wait 节点?

A: 完全可以!每个 Wait 节点都有独立的恢复 URL($execution.resumeUrl)和恢复逻辑。当它们被调用时会按顺序恢复


完整可执行工作流示例

以下是一个完整的人工审批工作流,你可以直接导入 n8n 使用:

{
  "name": "7天邮件跟进 + 人工审批工作流",
  "nodes": [
    {
      "name": "Webhook触发器",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [250, 250],
      "webhookId": "webhook_123",
      "httpMethod": "POST",
      "path": "user-signup",
      "authentication": "none"
    },
    {
      "name": "发送欢迎邮件",
      "type": "n8n-nodes-base.sendEmail",
      "typeVersion": 1,
      "position": [450, 250],
      "credentials": {
        "gmail": "Gmail Account"
      },
      "parameters": {
        "toEmail": "={{ $json.email }}",
        "subject": "欢迎加入!",
        "textPlain": "感谢注册。我们将在7天后给你发送特别优惠!"
      }
    },
    {
      "name": "等待7天",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1,
      "position": [650, 250],
      "parameters": {
        "resume": "after",
        "amount": 7,
        "unit": "days"
      }
    },
    {
      "name": "发送跟进邮件",
      "type": "n8n-nodes-base.sendEmail",
      "typeVersion": 1,
      "position": [850, 250],
      "credentials": {
        "gmail": "Gmail Account"
      },
      "parameters": {
        "toEmail": "={{ $json.email }}",
        "subject": "您的专属优惠仅剩48小时!",
        "textPlain": "我们为您准备了特别的优惠。立即查看详情吧!"
      }
    },
    {
      "name": "等待审批表单",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1,
      "position": [1050, 250],
      "parameters": {
        "resume": "form",
        "formTitle": "审批此用户的高级权限",
        "formDescription": "请审核该用户的信息并做出决定",
        "formFields": [
          {
            "fieldLabel": "审批决定",
            "fieldType": "dropdown",
            "required": true,
            "fieldOptions": [
              {
                "name": "批准",
                "value": "approved"
              },
              {
                "name": "拒绝",
                "value": "rejected"
              }
            ]
          },
          {
            "fieldLabel": "备注",
            "fieldType": "textarea",
            "required": false
          }
        ],
        "respondWhen": "formSubmitted"
      }
    },
    {
      "name": "根据审批结果分支",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 1,
      "position": [1250, 250],
      "parameters": {
        "cases": [
          {
            "condition": "string",
            "value1": "={{ $json.decision }}",
            "value2": "approved",
            "operator": "equal",
            "output": 1
          },
          {
            "condition": "string",
            "value1": "={{ $json.decision }}",
            "value2": "rejected",
            "operator": "equal",
            "output": 2
          }
        ]
      }
    },
    {
      "name": "发送批准邮件",
      "type": "n8n-nodes-base.sendEmail",
      "typeVersion": 1,
      "position": [1450, 150],
      "credentials": {
        "gmail": "Gmail Account"
      },
      "parameters": {
        "toEmail": "={{ $json.email }}",
        "subject": "恭喜!您已被批准升级为高级会员",
        "textPlain": "您现在可以享受所有高级功能了。欢迎加入!"
      }
    },
    {
      "name": "发送拒绝邮件",
      "type": "n8n-nodes-base.sendEmail",
      "typeVersion": 1,
      "position": [1450, 350],
      "credentials": {
        "gmail": "Gmail Account"
      },
      "parameters": {
        "toEmail": "={{ $json.email }}",
        "subject": "感谢您的关注",
        "textPlain": "非常感谢您的兴趣。如有疑问,请联系我们的支持团队。"
      }
    }
  ],
  "connections": {
    "Webhook触发器": {
      "main": [
        [
          {
            "node": "发送欢迎邮件",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "发送欢迎邮件": {
      "main": [
        [
          {
            "node": "等待7天",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "等待7天": {
      "main": [
        [
          {
            "node": "发送跟进邮件",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "发送跟进邮件": {
      "main": [
        [
          {
            "node": "等待审批表单",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "等待审批表单": {
      "main": [
        [
          {
            "node": "根据审批结果分支",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "根据审批结果分支": {
      "main": [
        [
          {
            "node": "发送批准邮件",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "发送拒绝邮件",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

如何使用这个工作流

  1. 登录你的 n8n 实例
  2. 创建新工作流
  3. 点击 菜单 → Import workflow
  4. 粘贴上面的 JSON 代码
  5. 配置你的 Gmail 凭证
  6. 点击 Activate

性能优化建议

1. 合理设置超时时限

场景:Webhook 恢复等待最多 24 小时
配置:
  - Limit Wait Time: 启用
  - Limit Type: After Time Interval
  - Amount: 1
  - Unit: days

2. 使用 IP 白名单保护 Webhook

场景:只允许特定服务调用恢复 Webhook
配置:
  - IP(s) Whitelist: 203.0.113.45, 198.51.100.89

3. 为多个 Wait 节点添加唯一后缀

场景:同一工作流有多个 Webhook 恢复点
配置:
  - Wait Node 1 Webhook Suffix: -approval
  - Wait Node 2 Webhook Suffix: -payment

总结

Wait 节点的四种模式 —— 时间间隔、指定时间、Webhook、表单提交

数据保存 —— 暂停期间执行数据会安全地保存到数据库

灵活的恢复 —— 可以基于时间、外部信号或用户输入恢复

广泛应用 —— API 速率控制、人工审批、定时任务、多级流程

性能友好 —— 长时间等待不会占用服务器资源


官方文档
n8n系列教程

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐