一、场景导入:新手的“选择困难症”
在 n8n 的世界里,当你完成一个 API 调用,或者需要对数据进行简单的重组时,工作流画布上往往会跳出两个让你纠结的“兄弟”:Set 节点 和 Code 节点。
作为 N8N大学 的老学长,我见过太多新手在这里卡壳。有的人图省事,把所有逻辑都塞进 Code 节点写 JS,结果维护起来像看天书;有的人过度依赖 Set 节点,结果数据结构稍微一变,整个流程就报错。
其实,这不仅仅是技术选型的问题,更是关于“效率”与“灵活性”的博弈。今天,我们就来硬核拆解一下,到底在什么场景下该用 Set,什么场景下必须上 Code。
二、核心定义:它们到底是什么?
在深入对比之前,我们先用大白话把这两个节点的本质讲透。
1. Set 节点:数据的“搬运工与整理师”
Set 节点 的核心作用是操作 JSON 数据。你可以把它想象成一个可视化的 Excel 表格编辑器。它的主要工作是:
- 新增字段:在数据中添加一个新的键值对。
- 重命名字段:把
user_name改成username。 - 删除字段:把不需要的敏感字段(如
password)删掉。 - 数据类型转换:把字符串
"123"转成数字123。
特点:全可视化操作,无需写代码,所见即所得。
2. Code 节点:全能的“瑞士军刀”
Code 节点 允许你编写 JavaScript (Node.js) 代码来处理数据。它不仅仅能整理数据,还能进行复杂的逻辑运算。
特点:灵活度极高,可以写循环、写判断、调用外部库,但需要具备基本的编程思维。
三、深度解析:Set 与 Code 的终极对决
为了更直观地展示两者的区别,N8N大学 整理了以下对比表:
| 维度 | Set 节点 | Code 节点 |
|---|---|---|
| 适用人群 | 零代码/低代码玩家,非程序员 | 有开发基础,需要处理复杂逻辑的工程师 |
| 学习成本 | 极低(拖拽配置即可) | 较高(需懂 JS 语法及 n8n 数据结构) |
| 处理能力 | 基础的数据映射、重命名、格式化 | 复杂计算、循环遍历、条件判断、正则匹配 |
| 执行效率 | 极高(原生编译,轻量级) | 略低(需启动 V8 引擎,有开销) |
| 可维护性 | 高(逻辑一目了然,适合团队协作) | 中(代码容易写乱,需规范注释) |
四、实战场景:到底该选哪个?
理论讲完了,我们直接上实战。以下是 N8N大学 总结的三条黄金法则:
场景一:简单的字段映射与重命名 —— 无脑选 Set
假设你从 API 获取了用户数据,字段是 user_email 和 first_name,但你需要存入数据库的字段是 email 和 name。
选 Set 节点:直接在配置面板里添加两个 Map Item,Source 选 user_email,Target 写 email。简单、快速、不出错。
别用 Code 节点:写 return [{ json: { email: $json.user_email, name: $json.first_name } }] 纯属浪费时间,且难以一眼看懂逻辑。
场景二:复杂的逻辑运算与数据清洗 —— 必须用 Code
假设你需要做以下操作:
- 计算两个日期之间的天数差。
- 根据用户 ID 的奇偶性判断是否发送邮件。
- 将一个数组(List)拼接成逗号分隔的字符串。
选 Code 节点:Set 节点无法处理这种逻辑判断和算法。虽然 Set 可以通过公式(Expression)写简单的表达式,但复杂的逻辑写在表达式里会变得非常冗长且难以调试。
代码示例:
// 在 Code 节点中处理数组
const items = [];
for (const item of $input.all()) {
// 只有当 ID 大于 10 时才处理
if (item.json.id > 10) {
items.push(item);
}
}
return items;
场景三:数据结构的“重塑” —— 看情况
如果你需要把一个扁平的数据结构变成嵌套的 JSON 对象(例如把 a=1, b=2 变成 { "info": { "a":1, "b":2 } })。
- 简单嵌套:Set 节点支持 Group Fields by Name 功能,可以快速构建层级。
- 动态嵌套:如果嵌套层级不确定或需要循环生成,Code 节点是唯一的选择。
五、避坑指南:新手常犯的错误
在 N8N大学 的社区里,关于这两个节点的报错层出不穷,这里列出两个最典型的坑。
坑 1:Set 节点的“数据覆盖”陷阱
很多新手在使用 Set 节点时,配置了几个字段,运行后发现数据少了一大半。
原因:Set 节点有一个默认行为是 Keep Only Set Fields(仅保留设置的字段)。如果你勾选了这个选项,且只设置了 name 字段,那么原始数据中的 id、email 等字段都会被丢弃。
解决方案:除非你明确只想输出特定字段,否则在 Set 节点配置中,务必取消勾选 Keep Only Set Fields。
坑 2:Code 节点的“返回格式”错误
在 Code 节点中,如果你直接返回 { a: 1 },n8n 可能会报错或无法将数据传递给下一个节点。
原因:n8n 的 Code 节点要求必须返回一个特定格式的数组,且每个元素必须包含 json 属性。
正确写法:
// 必须包裹在数组中,且包含 json 键
return [
{
json: {
name: "N8N大学",
website: "n8ndx.com"
}
}
];
六、FAQ 常见问题解答
Q1:我可以用 Code 节点完全替代 Set 节点吗?
可以,但不推荐。 虽然 Code 节点功能更强大,但 Set 节点在处理简单的字段映射时,性能更好、执行速度更快,且更易于团队协作维护。建议遵循“简单用 Set,复杂用 Code”的原则。
Q2:Set 节点能处理数组数据吗?
可以,但有限制。 Set 节点会对数组中的每一项(Item)独立进行处理。如果你需要跨 Item 的计算(比如计算累加和),Set 节点做不到,必须使用 Code 节点或 Aggregate 节点。
Q3:Code 节点里能引用其他节点的数据吗?
可以。 在 Code 节点中,你可以通过 $input.first() 获取上一个节点的第一条数据,或者通过 $input.all() 获取所有数据。如果你需要引用特定节点的数据,可以使用 $("节点名称").item.json 这种方式。
七、总结与资源
在 n8n 的开发中,Set 节点是“常规武器”,Code 节点是“战术核武器”。
作为 N8N大学 的首席主编,我的建议是:先尝试用 Set 节点解决问题,当你发现配置面板变得极其复杂,或者需要写很长的公式时,果断切换到 Code 节点。
保持工作流的简洁和可读性,是低代码自动化工程中最重要的素养。
相关资源推荐:
- N8N大学 官方文档:https://n8ndx.com
- n8n 官方社区:查看更多 Code 节点的 JS 案例