n8n Set节点:如何优雅地处理数组、对象和动态数据?

2026-02-19 11 0

场景导入:别再被“数据格式”卡住脖子

在 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 拉取数据后,直接连接 SpreadsheetSend 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 节点与“零值”处理

笔者在做全栈开发时,最怕的就是数据里有 nullundefined,这会导致整个 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-ValueMap 模式,你的 workflow 将不再脆弱,能够应对各种复杂多变的数据源。

如果你在实操中遇到了棘手的数组处理问题,欢迎访问 N8N大学 (n8ndx.com) 查看更多实战案例,或者加入我们的社区讨论。记住,优雅的自动化,始于对数据的精准掌控。

相关文章

n8n Error Handling 节点报错太心烦?试试这些更灵活的替代方案
n8n 节点报错了?用 Error Handling 让它自动重试并通知你
n8n Wait节点在数据同步中的延迟控制实战
n8n Wait节点免费版:我能用它实现定时任务吗?
n8n Error Handling节点:当自动化流程“翻车”时,如何让它自动“扶起来”?
n8n Error Handling节点报错常见问题解决

发布评论