写在前面:别让“类型不匹配”成为你自动化的绊脚石
笔者在 N8N大学 的社群里潜水时,经常看到新手朋友在调试工作流时发出类似的哀嚎:“明明在 If 节点里写好了判断条件,为什么流程就是走不通?”
点开一看,十有八九是数据类型搞错了。你以为你拿到的是数字 100,实际上它是个字符串 "100";你以为这是个数组对象,结果它只是个孤零零的字符串。
今天,笔者就来硬核拆解一下 n8n 的 If 节点到底“吃”哪些数据类型。搞懂这个,你的自动化逻辑才算真正踩在了坚实的地面上。
If 节点的底层逻辑:一切皆比较
在 n8n 的世界里,If 节点本质上是一个“裁判”。它的工作非常单纯:接收上游节点传来的数据(Item),根据你设定的条件(Condition),判断是走 True 还是 False 的分支。
既然是比较,就离不开“数据类型”。n8n 的 If 节点主要支持以下几大类数据类型作为判断依据:
1. 字符串 (String)
这是最常见的类型,比如用户名、邮件标题、状态码文本等。
- 支持的操作符: 等于、不等于、包含、不包含、正则匹配、长度判断等。
- 实战场景: 判断邮件标题是否包含“紧急”二字;判断 API 返回的状态是否为
"success"。 - 笔者提醒: 注意大小写敏感!n8n 默认是区分大小写的,如果你需要忽略大小写,请使用正则匹配模式(Regex)。
2. 数字 (Number)
用于数值比较,比如订单金额、用户 ID、HTTP 状态码等。
- 支持的操作符: 大于、小于、等于、不等于、范围判断(Between)。
- 实战场景: 判断订单金额是否大于 1000 元;判断 HTTP 请求返回的状态码是否为
200。 - 避坑点: n8n 很聪明,它能自动识别数字字符串。比如
"500"和500在比较时通常能正确判断,但为了严谨,建议在上游节点(如 Set 节点)明确指定数据类型。
3. 布尔值 (Boolean)
最简单的“是”或“否”,用于二元判断。
- 支持的操作符: 等于 true、等于 false。
- 实战场景: 判断用户是否订阅了邮件(
true/false);判断某个开关是否开启。
4. 数组 (Array) 与 对象 (Object)
这是新手最容易懵圈的地方。If 节点对复合数据类型的支持相对有限,通常需要配合表达式(Expression)使用。
- 数组: 你不能直接写
数组 等于 [1,2,3]。通常需要判断数组的长度($items.length),或者使用“包含”操作符判断数组里是否有某个特定元素。 - 对象: 同样,不能直接比较两个对象是否相等。你需要深入到对象的属性里去比较,例如
{{$json.user.status}}等于"active"。
5. 日期与时间 (Date)
n8n 支持 ISO 8601 格式的日期字符串(如 2023-10-27T10:00:00Z)。
- 支持的操作符: 大于、小于、等于(通常用于比较时间先后)。
- 实战场景: 判断创建时间是否在今天之后;判断任务是否已过期。
实战核心:如何正确使用表达式锁定数据类型
光知道支持哪些类型没用,关键在于你怎么在 If 节点里写代码。n8n 的 If 节点允许你切换输入项为“Expression”(表达式),这是处理复杂类型的关键。
场景一:处理字符串数字
假设 API 返回的金额是字符串格式:"1000"。如果你直接用“数字”类型判断它大于 900,可能会失败。
解决方案: 使用表达式强制转换类型。
在 If 节点条件中选择 Expression,输入:
{{ parseInt($json.amount) > 900 }}
这样你就把字符串变成了整数进行比较,逻辑稳如老狗。
场景二:判断数组是否为空
上游节点返回了一个列表,你想知道它是不是空的。
解决方案: 不要用“等于”去比较一个空数组。判断长度最靠谱。
在 If 节点条件中:
{{ $items.length > 0 }}
如果大于 0,走 True 分支;否则走 False 分支。
场景三:嵌套对象的属性判断
数据结构是这样的: { "user": { "profile": { "level": "VIP" } } }
解决方案: 直接点选或手写路径。
在 If 节点条件中:
{{ $json.user.profile.level === "VIP" }}
注意这里用了全等符号 ===,这是 JavaScript 的严格比较,能避免很多隐式类型转换带来的坑。
高级技巧:Combine Operations (组合操作)
n8n 的 If 节点不仅支持单条件,还支持多条件组合(AND/OR)。这在处理混合数据类型时非常有用。
比如你想判断:用户必须是 VIP(字符串),且积分大于 100(数字)。你可以添加两个条件,并将逻辑设置为 AND。
| 条件字段 | 数据类型 | 操作符 | 值 |
|---|---|---|---|
{{ $json.user.type }} |
String | 等于 | VIP |
{{ parseInt($json.score) }} |
Number | 大于 | 100 |
只有当两个条件的数据类型都匹配且逻辑成立时,流程才会走通。
常见报错与避坑指南
在 N8N大学 的教学实践中,关于 If 节点数据类型的报错通常集中在以下两点:
1. Null 或 Undefined 报错
当你试图判断一个不存在的字段(例如 {{ $json.not_exist }})时,n8n 会返回 null 或 undefined。
报错现象: 流程卡死或进入错误分支。
解决方案: 使用三元表达式做兜底处理。
{{ $json.status ? $json.status === 'ok' : false }}
意思是:如果 status 存在,判断它是否等于 'ok';如果不存在,直接返回 false。
2. 浮点数精度问题
涉及金额计算时,浮点数的比较是计算机的老大难。
避坑建议: 尽量避免直接比较两个浮点数是否完全相等。如果必须比较,可以先转换为整数(乘以100),或者设置一个极小的误差范围(Epsilon)。
在 n8n 中,最简单的做法是:在 If 节点之前,先用 Code 节点或 Set 节点将金额统一处理为整数(单位:分),然后再进行数字比较。
FAQ:用户常问的 3 个问题
Q1: If 节点支持 JSON 对象直接比较吗?
A: 不支持直接比较。JavaScript 中的两个对象即使内容一样,内存地址不同也会被判定为不相等。你需要比较对象内部的具体属性值。
Q2: 为什么我写的时间比较不准确?
A: 很可能是时区问题。n8n 默认使用 UTC 时间。如果本地时间是字符串格式,建议先用表达式将其转换为时间戳(Timestamp)再进行数字比较,这样最准确。
Q3: If 节点能处理二进制数据(如图片)吗?
A: 不能。If 节点是基于 JSON 数据流进行逻辑判断的。二进制数据通常作为文件流在 workflow 中传递,If 节点无法直接“看”图片内容做判断。你需要先通过 OCR 节点提取文字,再用 If 节点判断文字内容。
总结与资源
理解 n8n If 节点支持的数据类型,本质上是理解 JavaScript 的弱类型特性。记住一句话:在自动化流程中,显式地定义数据类型,永远比依赖隐式转换更安全。
如果你在调试工作流时遇到数据类型导致的逻辑分支错误,不妨回到上游节点,用 Set 节点把数据类型“锁死”,再传给 If 节点。
更多 n8n 硬核实战技巧,请持续关注 N8N大学 (n8ndx.com)。如果你有具体的报错案例,欢迎在评论区留言,笔者会挑选典型问题进行深度解析。