场景导入:别再被“数据格式”卡住脖子
在 N8N 大学(n8ndx.com)的后台,笔者每天都能看到无数的咨询。其中最高频的一个痛点就是:“为什么我从 API 拉回来的数据,下一个节点用不了?明明看起来是一样的啊?”
其实,这往往不是 API 的问题,也不是 n8n 的 bug,而是你没用好那个看似简单却深不可测的 Set 节点。
很多新手把 Set 节点简单理解为“给变量赋值”,但在实战中,它其实是你的“数据整形师”。当你面对复杂的嵌套对象、变动的数组,甚至是需要实时计算的动态字段时,Set 节点才是那个能让你优雅破局的关键。今天,笔者就带你彻底搞懂 Set 节点的底层逻辑,让你从“勉强能用”进阶到“优雅处理”。
核心定义:Set 节点到底在做什么?
通俗点说,Set 节点 就是 n8n 数据流的“整形手术台”。
在 n8n 中,数据是以 JSON 对象的形式在节点间流动的。每一个节点处理完,都会输出一组 items。Set 节点的核心作用,不是简单的存储,而是对这些 items 进行结构的重组、字段的提取或合并。
它有两个最核心的模式,也是很多人的盲区:
- Keep Key-Value:保留原有的数据结构,只新增或修改字段。
- Map:彻底重塑数据结构,通常用于将嵌套的深层数据“拍平”或提取关键信息。
笔者见过太多人用 HTTP Request 拉取数据后,直接连接 Spreadsheet 或 Send Email,结果因为字段名不对或者数据格式太乱而报错。其实,中间缺的就是这一步“数据整形”。
实战场景一:如何优雅地处理数组(Array)
数组是 n8n 中最常见的数据结构,也是最容易让人头疼的。比如你从一个电商 API 获取了订单列表,它长这样:
{
"orders": [
{ "id": 1, "status": "paid" },
{ "id": 2, "status": "shipped" }
]
}
如果你直接把这个 JSON 传给下个节点,n8n 默认只会生成一个 item。如果你想对每个订单单独处理(比如发邮件通知),你就必须“展开”这个数组。
使用“Map”模式展开数组
在 Set 节点中,我们将模式切换为 Map。这里有一个非常关键的技巧:
在 Expression(表达式)中,输入 {{ $json.orders }}。注意,此时 Set 节点的输出不再是原来的整个 JSON,而是仅仅保留了 orders 这个数组。
但这还不够,因为 n8n 会把整个数组塞进一个 item 里。要让 n8n 自动将数组拆分成多个 items,你需要利用 n8n 的一个“隐藏特性”:当你使用 {{ $json.orders }} 这样的表达式指向一个数组时,n8n 会自动在后台进行隐式迭代。
笔者的硬核建议: 如果你发现数组没有被自动拆分,请在 Set 节点后连接一个 Split Out 节点。但在 Set 节点中,我们通常做的是预处理。比如,你想把数组里的数据拍平成简单的对象,可以在 Set 节点的 Map 模式下,手动输入键值对:
- Key:
order_id| Value:{{ $item(0).$json.id }} - Key:
order_status| Value:{{ $item(0).$json.status }}
这样,无论原数据多么复杂的嵌套,你都能提取出最干净的字段供下游使用。
实战场景二:对象合并与动态数据桥接
另一个高频场景是“数据补齐”。假设你有两股数据流:一股是用户 ID 列表(来自 A 接口),另一股是用户详情(来自 B 接口)。如何把它们合并?
很多人会陷入死循环,试图用 IF 节点去匹配。其实,Set 节点配合 Keep Key-Value 模式才是正解。
动态字段的处理
当你的数据源字段名是动态的(比如以日期命名:2023-10-01_sales),直接引用会非常困难。Set 节点的表达式能力在这里大放异彩。
在 Set 节点的 Keep Key-Value 模式下,你可以添加一个新字段,比如叫 dynamic_value,然后在 Value 里写:
{{ $json[$today.toISODate()] }}
这样,无论明天 API 返回的字段名变成什么,你都能通过动态计算的 Key 去精准提取它。这种写法在处理日报、周报自动生成的 workflow 中简直是神器。
实战场景三:利用表达式进行数据计算
Set 节点不仅是“搬运工”,还是“计算器”。你完全不需要在写代码节点里写 JS,直接在 Set 节点里就能完成复杂的逻辑判断。
假设你需要判断订单金额是否达标,并打上标签:
- Key:
is_high_value - Value:
{{ $json.amount > 1000 ? 'VIP' : 'Normal' }}
这种三元运算符在 Set 节点中运行效率极高,因为它是在数据流转的最前端完成的,避免了后续节点不必要的计算负载。
避坑指南: 在 Set 节点写表达式时,一定要注意数据类型。n8n 的前端表达式编辑器非常智能,但如果你手动输入字符串(比如 "123"),它会被当作字符串处理,而不是数字。在做数学比较时,记得使用 parseInt() 或 parseFloat() 进行强制转换。
高级技巧:Set 节点与“零值”处理
笔者在做全栈开发时,最怕的就是数据里有 null 或 undefined,这会导致整个 JSON 解析崩溃。
在 Set 节点中,我们可以利用 ??(空值合并运算符)来优雅地处理这种情况:
{{ $json.username ?? 'Unknown User' }}
这意味着:如果 username 存在,就用它;如果不存在(null/undefined),就默认赋值为 'Unknown User'。
这在对接第三方不稳定 API 时是救命稻草。N8N 大学通常建议在数据流入核心处理逻辑前,先经过一个 Set 节点做“兜底处理”,确保每个字段都有值,哪怕是默认值。
FAQ 问答
Q1: Set 节点和 Code 节点有什么区别?我该用哪个?
A: 简单的数据提取、重命名、计算,优先用 Set 节点,因为它执行效率高且无需编写 JS 代码。只有当你需要复杂的循环、正则匹配或调用外部库时,才考虑 Code 节点。Set 节点是 80% 场景下的首选。
Q2: 为什么我在 Set 节点里写的表达式显示红色报错?
A: 这通常是因为路径引用错误。检查你的表达式是否以 {{ $json. 开头。如果是引用之前的节点数据,确保路径正确。另外,n8n 对字符串的引号很敏感,表达式内部不需要加多余的单引号或双引号(除非是字符串值本身)。
Q3: Set 节点处理后的数据,怎么确认格式是正确的?
A: 利用 n8n 的调试功能。点击 Set 节点,在输出面板查看 JSON 结构。N8N 大学推荐一个习惯:在关键的数据转换节点后,加一个 Wait 节点或者 No-Op 节点,方便你在运行中暂停并检查数据快照。
总结与资源
Set 节点是 n8n 自动化流程中的“瑞士军刀”。它看似简单,实则承载了数据清洗、格式转换、逻辑计算等核心功能。掌握好 Set 节点的 Keep Key-Value 和 Map 模式,你的 workflow 将不再脆弱,能够应对各种复杂多变的数据源。
如果你在实操中遇到了棘手的数组处理问题,欢迎访问 N8N大学 (n8ndx.com) 查看更多实战案例,或者加入我们的社区讨论。记住,优雅的自动化,始于对数据的精准掌控。