嘿,别让 Merge 节点把你“合并”进坑里
在 N8N 大学摸爬滚打的这 8 年,我见过太多新手在 Merge 节点上栽跟头。明明数据都进来了,怎么一合并就报错?或者合并出来的数据乱七八糟,完全不是想要的结果。
今天,笔者就把这个坑替你踩完。别再对着官方文档发呆了,跟着我走一遍,保证你以后用 Merge 节点就像喝水一样自然。
问题复现:Merge 节点到底在“作”什么妖?
通常,你遇到的场景是这样的:你有两条数据流,一条是用户信息,一条是订单数据。你想把它们通过用户 ID 拼在一起,于是拖拽了一个 Merge 节点。结果呢?运行报错,或者合并没有任何输出。
最典型的报错代码是:
ERROR: Cannot read property 'map' of undefined或者Input 1 is empty
这通常不是因为你的数据错了,而是你没搞懂 Merge 节点对数据类型的“洁癖”。它严格要求输入的两条数据必须是同一种数据结构,或者你需要明确告诉它如何处理差异。
原因分析:为什么它这么挑剔?
用大白话说,Merge 节点就像一个挑剔的裁缝。它需要两块布料(数据流)的纹理(结构)对齐,才能缝合。
如果你的输入 A 是一个对象数组(比如 [{id:1, name:"Alice"}]),而输入 B 是一个简单的字符串(比如 "Success"),Merge 节点会直接懵圈,因为它不知道怎么把这两者“合并”。
更隐蔽的坑在于:数据类型不匹配。比如输入 A 的 ID 是数字 123,输入 B 的 ID 是字符串 "123"。在 JavaScript(n8n 的底层语言)里,123 !== "123"。当你选择“按 ID 匹配”时,它匹配不到任何东西,导致输出为空。
解决方案:三步调教 Merge 节点
第一步:使用 Set 节点统一数据格式
在进入 Merge 节点之前,务必使用 Set 节点(或 Edit Fields)清洗数据。
假设你有两股数据流:
- 流 A:用户数据(包含
user_id) - 流 B:订单数据(包含
user_id)
在流 B 进入 Merge 之前,加一个 Set 节点。如果你的 user_id 在流 A 是数字,在流 B 是字符串,请强制转换:
- 字段名:
user_id - 字段值:
=parseFloat($json.user_id)(确保两边都是数字类型)
第二步:正确配置 Merge 节点的参数
这是核心操作。拖入 Merge 节点,连接两股数据流。重点关注以下参数:
- Merge Mode(合并模式):通常选择
Wait for both inputs(等待两条输入)。这意味着必须两条数据都到了才触发。 - Join Type(连接类型):如果你是想把订单数据附加到用户数据上,选择
Left Join(左连接)。如果只想取两边都有的数据,选Inner Join。 - Matching Key(匹配键):这是最大的坑点!
在“Matching Key”处,你需要输入一个点表示法(Dot Notation)。如果你的结构是 json.user_id,这里就填 user_id。
注意:如果两边的键名不同(比如一边叫 id,一边叫 userId),你必须在 Set 节点里把它们改成一样的名字,Merge 节点才认。
第三步:处理“多对一”或“一对多”的数据膨胀
有时候你合并了,发现输出的数据量翻倍了,或者莫名其妙多了很多条。这是因为数据类型变成了数组。
如果你的输入 A 是单条数据,输入 B 是多条数据(数组),Merge 后的输出通常会保留数组结构。如果你需要展开它,记得在 Merge 后面加一个 Split Out 节点,把数组拆分成独立的 Item,否则下游节点可能会处理异常。
避坑指南:这些细节决定成败
1. “Wait for both inputs” 的陷阱
很多人喜欢用 Wait for both inputs,但如果你的其中一条数据流是空的(比如 Webhook 触发了但没查到数据),Merge 节点会无限等待,导致流程卡死。
解决方案: 在 Merge 之前,给数据流少的那一路加一个 No-Op(空操作)节点或者设置一个默认值,确保 Merge 节点能收到信号。
2. 空数组导致的匹配失败
如果你的输入 A 是空数组 [],输入 B 有数据。无论你选什么 Join 模式,结果通常都是空。
解决方案: 在 Merge 前加一个 IF 节点判断。如果数据为空,走另一条路,或者直接结束流程,不要让它进 Merge 去做无用功。
3. 忽略了 Item 的层级
n8n 处理的是 Item(项)。Merge 节点是按 Item 对 Item 进行匹配的。如果你的数据层级不对(比如数据藏在 json.data.list 里),你需要先用 Set 节点把数据提到顶层,或者用 Move 节点调整结构。
FAQ 问答
Q1: 为什么我的 Merge 节点输出全是空值?
最可能的原因是 匹配键(Matching Key) 的数据类型不一致。请检查两边的 ID 是否一边是数字,一边是字符串。使用 Set 节点强制转换为同一种类型即可。
Q2: Merge 节点能不能合并三个以上的数据流?
可以,但不推荐直接连成一条长龙。更好的做法是分层合并:先合并前两个,再把结果与第三个合并。或者使用 Wait 节点配合 Webhook 来聚合多路数据,这样逻辑更清晰。
Q3: “Left Join” 和 “Inner Join” 到底选哪个?
简单记:Left Join 是以第一条输入为主,第二条有的就合进来,没有的就留空。适合“用户信息 + 订单详情”。Inner Join 是两边都必须有,没有的就丢弃。适合“找交集”。
总结与资源
搞定 Merge 节点的核心就一句话:数据类型要对齐,匹配键要一致,空数据要预判。
在 N8N 大学,我们坚持认为自动化不是写代码,而是理逻辑。下次遇到 Merge 报错,别慌,先检查数据流的源头和结构。
如果你还想深入了解更多 n8n 的硬核技巧,欢迎访问 N8N 大学官网,或者加入我们的社区,一起交流避坑经验。