问题复现:Merge节点到底在“卡”什么?
作为 N8N大学 的主编,我见过太多新手在 Merge 节点上栽跟头。你是不是也遇到过这种情况:明明两条分支的数据都准备好了,一接上 Merge 节点,数据要么莫名丢失,要么输出结果乱成一锅粥?
最常见的场景是:你用 Spreadsheet File 节点读取了一个 Excel 表格,又用 HTTP Request 获取了一组 API 数据,想根据某个 ID 把它们拼在一起。结果点击 Execute Workflow 后,发现合并后的数据要么只有左边的,要么只有右边的,甚至直接报错 ERROR: Cannot read properties of undefined。
这种“卡壳”通常不是 n8n 崩了,而是我们没搞懂 Merge 节点底层的匹配逻辑。它是 n8n 里最灵活但也最容易让人迷惑的节点之一。
原因分析:为什么数据总是合不到一起?
用大白话讲,Merge 节点就像一个挑剔的媒人。它不是把两堆数据随便扔进一个篮子,而是要求你指定“谁和谁是一对”。
如果你选择了默认的 Merge By Position(按位置合并),它会假设左边第一条数据对应右边第一条数据。但如果你的 API 数据顺序乱了,或者左边比右边多了几行,合并就会立刻出错。
另一个常见坑点是 Input Data Mode(输入数据模式)。默认是 Merge Inputs,这意味着它试图把所有输入的数据流融合。但如果你的数据结构不一致(比如左边是 JSON 对象,右边是数组),n8n 就会懵圈,不知道怎么处理。
解决方案:这 3 个方法亲测有效
别急,笔者整理了 3 种最实用的合并策略,从简单到进阶,总有一款适合你的场景。
方法一:按位置合并(Merge By Position)
这是最基础的用法,适合数据源已经严格排序的场景。
操作步骤:
- 拖入
Merge节点,连接两个上游节点。 - 在 Mode 下拉框中选择 Merge By Position。
- 关键设置:勾选 Combine > Keep Matches(保留匹配项)。
适用场景: 比如你从 Excel 读取了 10 行产品名称,又从另一个 API 获取了 10 行对应的库存量,且它们的行号完全一致。
避坑指南: 如果两边数据量不同,多出来的部分会被丢弃。如果你需要保留所有数据,请看方法三。
方法二:按字段匹配合并(Merge By Key)
这是 n8n 中最常用、最稳健的方法。只要两边数据都有共同的 ID,就能精准配对。
操作步骤:
- 将 Mode 设置为 Merge By Key。
- 在 Input 1 Field 和 Input 2 Field 中分别填入两边用于匹配的字段名(例如
user_id)。 - 如果你的字段名不一致,可以先用
Set节点重命名,确保两边 key 一致。
核心参数: 注意 Output Type。如果你希望合并后的数据以 JSON 对象形式输出,选择 Object;如果希望保持数组结构,选择 Array。
笔者经验: 这种方法对数据顺序没要求,哪怕左边乱序,右边乱序,只要 ID 对得上,n8n 就能帮你把它们“缝”在一起。
方法三:选项卡合并(Option Tabs / Let Me Choose)
当你需要更精细的控制,或者想把所有数据不管是否匹配都保留下来时,这个方法是神器。
操作步骤:
- 在 Mode 中选择 Let Me Choose(或 Option Tabs,视版本而定)。
- 你会看到两个输入端口,分别配置它们的匹配字段。
- 在 Join Type(连接类型)中,选择 Left Outer Join(左连接)。
场景实战: 假设你有 100 个用户数据(左),但只有 50 个用户有订单记录(右)。使用左连接,合并后的结果依然是 100 条数据,没有订单的用户对应的订单字段为空(null),而不是直接消失。
避坑指南: 千万不要在不匹配的数据量级差异巨大时使用 Inner Join(内连接),否则你的数据会“缩水”到让你怀疑人生。
进阶技巧:当 Merge 节点依然报错时
如果你试了以上方法还是不行,通常是因为数据格式不兼容。
请在 Merge 节点前插入一个 Set 节点(或 Function 节点)进行强制转换。例如,如果一边是字符串类型的 ID,一边是数字类型,n8n 会认为它们不相等。
在 Set 节点中,使用 JavaScript 表达式强制转换类型:
// 将字符串 ID 转为数字
{{ parseInt($json.id) }}
确保两边的匹配字段类型一致,这是合并成功的隐形杀手。
FAQ 问答
Q1: Merge 节点合并后,数据顺序乱了怎么办?
A: n8n 的 Merge 节点默认不保留原顺序。如果你需要严格保持顺序,建议在合并前给数据添加一个临时的 sort_index 字段,合并后再根据这个字段排序,最后删掉该字段。
Q2: 为什么我的合并结果全是空的?
A: 这通常是因为匹配字段的值不完全相等。请检查是否有隐藏的空格(使用 Trim 函数处理)或数据类型不一致(如 "123" vs 123)。可以使用 Function 节点打印日志查看具体值。
Q3: 能同时合并超过 2 个输入源吗?
A: 可以。n8n 的 Merge 节点支持多个输入端口。你可以点击节点的输入端口圆点,选择 Connect to > Add Input,然后配置每个输入源的匹配逻辑。
总结与资源
搞定 n8n 的 Merge 节点,核心在于理解“匹配逻辑”。不要盲目使用默认设置,根据你的数据关系选择 按位置、按字段 或 连接类型。
笔者建议大家在构建复杂工作流时,先用少量数据测试 Merge 的逻辑,确认无误后再跑全量数据。如果你在实操中遇到更诡异的报错,欢迎在 N8N大学 的社区留言,我们一起避坑。
更多 n8n 进阶教程,请持续关注 n8ndx.com。