在 n8n 的生态系统里,如果把 Webhook 节点比作守门人,HTTP Request 节点比作快递员,那么 Set 节点一定是那个默默无闻却至关重要的“数据整形师”。
笔者见过太多新手在搭建工作流时,遇到数据格式不匹配就直接写 JavaScript 代码节点,结果逻辑越写越乱,维护性极差。其实,90% 的数据清洗和转换需求,利用好 Set 节点就能优雅解决。
今天,N8N大学 就带你彻底搞懂这个被低估的“瑞士军刀”,教你如何不写一行代码,实现数据的丝滑转换。
一、Set 节点到底在做什么?
很多同学容易把 Set 节点和 Code 节点搞混。简单来说,Code 节点是让你写代码逻辑,而 Set 节点是让你“描述”数据结构。
在 n8n 的数据流中,数据是以 JSON 对象(包含 items 数组)的形式传递的。Set 节点的核心作用有两个:
- 数据透传(Keep Existing): 保留上游传来的所有数据。
- 数据重塑(Mapping): 重新定义数据的 Key(键)和 Value(值),甚至可以只保留你选中的字段。
举个最简单的例子:上游传来了一个复杂的用户对象,包含 ID、姓名、邮箱、地址等 20 个字段,但你只需要把“姓名”和“邮箱”传给下一个 HTTP 节点。这时候,Set 节点就是最佳选择。
二、实战操作:四种常见数据转换场景
光说不练假把式。下面笔者通过 4 个实战场景,手把手教你 Set 节点的硬核操作。
场景 1:字段重命名与提取(最常用)
假设你从 API 获取的数据字段名是 user_name 和 user_email,但下游系统(比如 CRM)要求的是 name 和 email。
- 在 Set 节点中,将 Mode 设置为 Keep existing(保留原有数据,方便后续调试)。
- 在下方的 Fields to Set(要设置的字段)中添加两项:
- 第一项:Name 填
name,Value 选择user_name(从左侧数据面板拖拽)。 - 第二项:Name 填
email,Value 选择user_email。
这样,输出的数据中既保留了原始结构,又新增了符合下游标准的字段。
场景 2:数据类型强制转换
这是一个新手极易踩坑的地方。从 API 返回的数字(如 ID:12345)往往被识别为字符串("12345")。如果你需要把它存入数据库的数字字段,或者进行数学计算,就必须转换类型。
在 Set 节点中,你可以利用 n8n 的表达式函数进行转换:
- 新建一个字段,比如叫
id_int。 - Value 处填写表达式:
{{ $json.id }}(假设原始字段是 id)。 - 或者更严谨地使用函数:
{{ parseInt($json.id) }}。
同理,字符串转布尔值可以用 {{ $json.status === 'true' }}。这种细节能让你的工作流在处理逻辑时更加健壮。
场景 3:构建复杂的嵌套结构
有时候我们需要把几个平级的字段,合并成一个对象(JSON 嵌套)。比如有 city 和 street 字段,需要变成 address: { city: ..., street: ... }。
Set 节点支持直接在 Value 中写 JSON 表达式:
- Name 填
address。 - Value 填:
{{ { "city": $json.city, "street": $json.street } }}。
注意:这里的大括号是表达式的一部分,直接构建了一个新的 JavaScript 对象。
场景 4:清空数据(打造“纯净”的请求体)
这是一个高阶技巧。当你从 Webhook 接收了一大堆杂乱数据,只想把其中的几个参数发给某个 API,不希望任何脏数据被带过去时:
将 Set 节点的 Mode 改为 Set value for a custom field(或者在 Keep existing 模式下删除字段,但更推荐使用 Output 设置)。
实际上,n8n 的 Set 节点有一个更直接的“清空”方式:
- 创建一个新的 Set 节点。
- Mode 选择 Set value for a custom field。
- 只添加你想要保留的字段。
- 这样,输出的 item 就只会包含你定义的字段,原数据被彻底“清洗”掉了。
三、避坑指南:Set 节点的常见误区
在 N8N大学 的实战教学中,Set 节点有两个常见的“坑”,大家一定要注意。
1. 并不是所有字段都需要“保留”
很多同学习惯在每个 Set 节点都选 Keep existing。虽然这很安全,但会导致数据流越来越臃肿。如果你确定后续节点只需要特定字段,果断选择 Set value for a custom field,这能显著降低内存占用,也方便排查日志。
2. 混淆了 Set 和 Code 节点的边界
如果你发现自己在 Set 节点的 Value 里写了超过 3 行的嵌套表达式,或者逻辑非常复杂(比如需要 if/else 判断),请立刻停止,切换到 Code 节点。
Set 节点擅长“静态映射”,Code 节点擅长“动态逻辑”。用 Set 节点写复杂逻辑是本末倒置,维护起来会非常痛苦。
3. 忽视了数据维数(Item Count)
Set 节点是“一对一”处理的。如果你上游传来了 10 条数据,Set 节点也会输出 10 条处理后的数据。如果你希望把多条数据合并成一条(例如汇总统计),Set 节点做不到,你需要使用 Aggregate 节点或 Code 节点来处理。
四、FAQ:关于 Set 节点的高频问答
Q1: Set 节点和 Merge 节点有什么区别?
A: 这是两个完全不同的概念。Set 节点用于修改或创建单条数据流内部的字段(数据整形);而 Merge 节点用于合并两个或多个不同来源的数据流(数据聚合)。简单说,Set 修内功,Merge 搞联姻。
Q2: 为什么我在 Set 节点设置的值,下一个节点读不到?
A: 请检查你是否开启了 “Raw” 模式?在 Set 节点的 Value 输入框旁边,有一个 Raw/Expression 切换。如果你要引用上游变量(如 {{ $json.id }}),必须切换到 Expression 模式。如果是纯文本字符串,Raw 模式即可。
Q3: Set 节点能处理数组(Array)数据吗?
A: 可以。你可以通过表达式操作数组。例如,你想把字符串字段按逗号分割成数组,可以在 Value 里写:{{ $json.tags.split(',') }}。但如果是复杂的数组遍历(例如把数组里的每个对象提取出来),建议配合 Split Out 节点或 Code 节点使用。
总结与资源
Set 节点是 n8n 数据流中最基础的组件,掌握它的核心在于理解 n8n 的 JSON 数据结构。它不是用来写逻辑的,而是用来定义数据的“形状”。
记住笔者的建议:能用 Set 节点解决的映射问题,绝不要轻易打开 Code 节点。保持工作流的简洁,是自动化专家的必修课。
如果你在使用 Set 节点时遇到了棘手的表达式问题,欢迎在 N8N大学 的社区留言,我们会第一时间为你解答。