简介

每个真实场景下的工作流最终都会遇到分岔路口:仅当交易金额超过 10,000 美元时才发送通知,根据订单状态以不同方式处理订单,当字段为空时跳过某个步骤。n8n 通过条件分支来处理所有这些场景——根据工作流中实际流动的数据,将执行路由到不同的路径。

n8n 为此提供了两个节点:IF 节点用于二元的是/否决策,Switch 节点用于需要两种以上结果的场景。知道该选用哪一个,以及如何精确配置条件,是区分脆弱工作流与生产级稳定工作流的关键。

流程图:单个输入节点通过 IF 节点拆分为两条路径——一条标注为 TRUE,一条标注为 FALSE,各自连接到不同的动作节点

IF 节点:二元分支

IF 节点根据输入数据评估一个或多个条件,并将每个数据项路由到 TRUE 输出或 FALSE 输出。数据不会同时进入两个分支——每个数据项只能选择一条路径。

配置时,你需要从输入数据中选取一个值(通常是字段引用,例如表达式语法),选择一个运算符,并设置一个比较值。n8n 针对不同数据类型支持多种运算符:

字符串类型:等于、不等于、包含、以……开头、以……结尾、正则匹配。数字类型:等于、不等于、大于、小于、大于等于、小于等于。布尔类型:为 true、为 false。数组和对象类型:为空、不为空。

下面是一个简单示例:webhook 接收订单数据,你需要将高价值订单路由到一个特殊的 Slack 频道。

在 IF 节点中你可以这样设置:值 1 —— 引用订单金额字段的表达式;运算 —— 大于;值 2 —— 10000。

金额超过 10,000 的数据项从 TRUE 输出离开,其余数据项从 FALSE 输出离开。然后你可以将每个输出连接到各自的下游节点。

你可以在一个 IF 节点内叠加多个条件,使用 AND(全部必须通过)或 OR(任一通过即可)。请注意,当条件超过三个时,AND 链会变得难以阅读——此时拆分为顺序的 IF 节点,或改用 Switch 节点,通常会更清晰。

Switch 节点:多种结果

当你有超过两条可能的路由时,堆叠 IF 节点会很快变得混乱。Switch 允许你定义多条规则,每条规则对应一个输出,自上而下进行评估。第一个匹配的规则胜出,数据项从该输出离开。

Switch 还有一个 Fallback(兜底)输出——没有任何规则匹配的数据项会落入这里。务必为兜底输出连接一个节点,哪怕只是一个 No Operation 节点,这样你就能知道未匹配的数据项发生了什么。

一个实际示例:你接收支持工单,并希望按优先级进行路由。

json
Rule 1: priority equals "critical" → Output 0 → PagerDuty node
Rule 2: priority equals "high" → Output 1 → Slack node
Rule 3: priority equals "low" → Output 2 → Email node
Fallback → Output 3 → Log to spreadsheet

在 n8n 中,每条规则的配置方式与 IF 条件相同——选择一个字段、选择一个运算符、设置一个比较值。区别在于,每条规则在节点上拥有自己独立的编号输出连接器。

流程图:Switch 节点具有一个输入和四条输出分支,分别标注为 critical、high、low 和 fallback,各自连接到不同的动作节点

有一个值得了解的细节:默认情况下,Switch 节点只会将每个数据项路由到第一条匹配的规则。如果你启用「Send data to all matching outputs」(将数据发送到所有匹配的输出)开关,数据项可以同时从多个输出离开。这在某些场景下很有用,但如果没预料到这种行为,可能会导致下游动作重复执行——除非你明确需要扇出行为,否则建议保持关闭。

常见错误

类型不匹配是导致静默失败的最常见原因。如果传入字段包含字符串 "1500",而你使用数字运算符「Greater Than」(大于)将其与 1000 比较,根据数据来源的不同,n8n 可能不会自动将字符串转换为数字。请使用 Set 节点或类似 `parseInt()` 的表达式在分支判断之前对类型进行规范化。

另一个常见错误是将 IF 节点的 FALSE 输出或 Switch 节点的 Fallback 输出保持未连接。n8n 不会抛出错误——这些数据项只会从执行中悄然消失。在处理客户记录的工作流中,这类静默丢弃的问题日后往往很难调试。请为每个输出都连接上某个节点,哪怕只是一个最简的日志记录步骤。

还要注意空值或 null 字段。将 null 值与「等于某个字符串」进行比较,结果为 false,这通常是符合预期的——但「is empty」和「is not empty」的行为与「等于空字符串」并不相同。请使用实际的 null 负载进行测试,而不仅仅是空字符串。

总结

当你的决策是二元的——TRUE 或 FALSE、是或否、匹配或不匹配——请使用 IF 节点。当你需要三种或更多不同的结果,并希望获得清晰、独立的输出路径,而无需链式连接多个 IF 节点时,请使用 Switch 节点。在这两种情况下,请始终显式处理未匹配的路径、在比较之前对数据类型进行规范化,并使用边界场景的输入(null、空字符串、意外类型)进行测试,然后再部署到生产环境。这两个节点是任何真正执行条件逻辑的工作流的基石。

课程检查点

1. n8n 中 IF 节点的两个输出路径是什么?

2. 什么时候应该优先选择 Switch 节点而非链式连接多个 IF 节点?

3. 在 Switch 节点中,没有匹配到任何已定义规则的数据项会怎样?

4. 将 IF 节点的 FALSE 输出保持未连接会有什么风险?

5. 你有一个以字符串 "1500" 形式传入的字段,并使用数字运算符「Greater Than」将其与 1000 比较。最安全的做法是什么?

6. 在 Switch 节点上启用「Send data to all matching outputs」会有什么效果?

7. 在单个 IF 节点内使用 AND 逻辑组合多个条件时,数据项走上 TRUE 路径需要满足什么?