n8n怎么实现子workflow的回调?

Created on: February 6, 2025

Answered using O1 by Chat01

Question

n8n怎么实现子workflow的回调?

Thought

Working through sub-workflows

I’m looking at how to incorporate callbacks for sub-workflows in n8n, leveraging the "Execute Workflow" node for data retrieval from main to sub-workflow.

Mapping out data exchange

I’m analyzing the use of "Execute Workflow" and "Wait" nodes to handle asynchronous calls, focusing on callbacks and data transfer between parent and child workflows via webhooks.

Charting async calls

I’m working through the asynchronous sub-workflow arrangement, suggesting the use of a Webhook node in the parent workflow to receive callback data from the asynchronous task.

Wrapping up the process

I’m detailing the steps for asynchronous sub-workflow calls: trigger the child workflow, pass a callback URL, use HTTP requests for results, and employ Webhook nodes in the parent workflow to handle callbacks effectively.

Reasoned about n8n子workflow回调实现 for 30 seconds

Answer

在 n8n 中,如果你希望“主工作流(Parent Workflow)”调用“子工作流(Child Workflow)”并等待子工作流完成后“回传”一些数据(也可以理解为一次异步的调用-回调流程),常见有两种实现方式:


1. 直接使用 Execute Workflow 节点(同步调用)

适用场景: 子工作流执行时间可控且不会无限等待,需要的回调结果就是子工作流的执行输出。

n8n 内置了一个 Execute Workflow 节点,可以把它理解成一个“子工作流”的同步调用。其工作原理是:

  1. 在主工作流中,使用 Execute Workflow 节点,配置要调用的子工作流。
  2. 当主工作流运行时,会等待子工作流执行完成。
  3. 子工作流执行完成后,返回的输出数据会自动“回传”到主工作流的 Execute Workflow 节点,并继续后续节点流程。

这种方式不需要你手动实现“回调”逻辑,n8n 会在后台自动等待子工作流完成,结果可以直接在后续节点中引用。例如,假设子工作流返回了某些处理结果,你在主工作流里的下一步节点中,就可以用 {{$json}} 或者 {{$json["字段名"]}} 获取子工作流的输出数据。

主要优点

  • 简单、开箱即用:配置一个 Execute Workflow 节点即可。
  • 同步执行,执行顺序一目了然。

主要局限

  • 只能是同步等待,如果子工作流需要很长时间或者需要用户交互等异步操作,主工作流会一直挂起等待,不适合在“异步长等待”场景下使用。

2. 使用 Webhook + HTTP Request 构建异步回调

适用场景: 子工作流中存在无法立即结束的操作(例如需要用户确认、第三方回调、长时间任务排队等),想要在子工作流真正完成时再通知主工作流。

如果你的子工作流不是“立即”就有结果,需要一个异步的回调,那么就需要主、子工作流分别配合使用 Webhook / HTTP Request 这样的节点,以模拟“主→子异步调用,子→主回调通知”的场景。

下面是一种常见的思路:

  1. 主工作流里创建 Webhook 节点

    • 在主工作流中配置一个 Webhook 节点,用于等待子工作流最终的回调。你会得到一个回调 URL(例如 https://xxxxx/webhook/abcdefg)。
    • n8n 中可以使用 Webhook 节点来接收 HTTP 请求,当有人向这个 URL 发起请求时,主工作流就会继续执行后续逻辑。
  2. 子工作流异步执行,最后通过 HTTP Request 调用主工作流的 Webhook

    • 在子工作流开始执行前,你可以把上面得到的 Webhook 回调 URL 通过某种方式传递给子工作流(比如把 URL 写在子工作流的 Start 或者其他节点的参数里)。
    • 子工作流处理完毕后,最后一步使用一个 HTTP Request 节点,向主工作流里这个 Webhook URL 发送请求,并附带你想要“回调”的数据。
  3. 主工作流在 Webhook 节点处拿到回调数据后,再进行处理

    • 当主工作流里的 Webhook 节点收到子工作流的 POST/GET 请求,就会继续执行 Webhook 节点之后的所有节点,得到子工作流传回来的数据,做进一步处理。

主要优点

  • 可以应对异步长时间操作,子工作流不需要一直占用主工作流的执行。
  • 在主、子之间可以传递更多自定义信息(HTTP 请求参数或 Body)。

主要局限

  • 逻辑上相对复杂,需要两边都有 Webhook/HTTP Request 的处理和配置。
  • 需要额外考虑 Webhook URL 的安全性、鉴权等问题。

实际配置示例思路

下面以“主工作流 + 子工作流 + 回调数据”简要举例:

(A)主工作流

  1. Webhook 节点(设为 等待子工作流结果

    • Method:POST(或 GET)
    • Path:可以自己定义,例如 /subworkflow-callback
    • 这个节点的作用就是当子工作流完成后,往这个 URL 发起 HTTP 请求时,触发后续。
  2. 之后的处理节点(假设为一个 Function 或者任意处理数据的节点)

    • 在这里用 {{$json}} 就能读到子工作流回调时带来的数据。

(B)子工作流

  1. 执行逻辑

    • 中间执行任何你想要的逻辑,例如处理大量数据、与第三方系统交互、等待一段时间等。
  2. HTTP Request 节点(发起回调)

    • 目标 URL:填写从主工作流获取的 Webhook 地址(可以是直接写死,也可以通过环境变量/参数传递)。
    • Method:POST(或 GET),Body 中携带你想要的回调数据。

当子工作流走到最后一步时,发起这个 HTTP 请求,那么主工作流就会在对应的 Webhook 节点处被激活,拿到数据后继续执行下去,相当于“子工作流调用→完成后向主工作流回调”的流程就实现了。


小结

  1. 简单同步场景:直接用 Execute Workflow 节点就行,不需要显式的“回调”,n8n 会把子工作流的返回当作输出,在主工作流后续节点可用。
  2. 复杂异步场景:可以使用 Webhook / HTTP Request 的方式,让主工作流先暴露一个回调接口,子工作流在真正完成时再请求这个回调接口,把数据传回主工作流。

根据不同的需求和执行时长,以及对数据传输的灵活度要求,你可以选择不同的方式来“实现子工作流的回调”。在实际项目中,如果能保证子工作流不会等待太久,Execute Workflow 节点通常最简单;若子工作流执行不确定、甚至可能要等待外部事件,则构建 Webhook + HTTP 回调的异步模式更合适。

Share this Q&A