别再被 Function 节点吓退了,这可能是 n8n 中最强大的“瑞士军刀”
在 N8N 大学的社区里,我见过太多新手在看到 Function 节点时犹豫不决。大家普遍的反应是:“我会用 n8n 的拖拽,但我不懂写代码。”
其实这是一个巨大的误区。Function 节点并不是一道高墙,而是一把梯子。它允许你突破预设节点的限制,去处理任意复杂的数据逻辑。今天,笔者就带你从零开始,用“大白话”把 JavaScript 代码在 n8n 中的实战逻辑彻底讲透。
场景导入:当现成节点不够用时,你该怎么办?
假设你正在做一个电商自动化流程:每当有新订单,你就要修改一下商品描述,给价格打个 9 折,然后把订单时间转换成北京时间。
如果用 n8n 的原生节点,你可能需要串联 3 个不同的节点:一个修改文本,一个做数学计算,还有一个转换时区。流程图会变得非常臃肿,而且如果中间步骤出错,排查起来非常麻烦。
这时候,Function 节点就是你的救星。只需一个节点,几行 JS 代码,就能完成上述所有操作。这不仅让流程更简洁,执行效率也更高。
Function 节点的核心机制:输入与输出
在开始写代码之前,我们必须理解 Function 节点的工作原理。它非常像一个黑盒子:
- 输入 (Input):上一个节点传递过来的数据(通常是 JSON 对象)。
- 处理 (Process):你编写的 JavaScript 逻辑。
- 输出 (Output):处理后的新数据,传递给下一个节点。
在 n8n 中,Function 节点使用的是 Node.js 环境(目前主要是兼容 CommonJS 语法)。你不需要引入任何库,直接使用原生 JS 即可操作数据。
实战入门:三个必学的代码片段
笔者为你准备了三个最常用的实战场景。请打开你的 n8n 编辑器,跟着操作。
1. 简单的数据处理:修改字段值
这是最基础的操作。假设输入数据是一个用户对象:{ "name": "张三", "age": 25 }。我们想给年龄加 1 岁,并添加一个问候语。
在 Function 节点中,输入以下代码:
const user = $input.first().json;
// 修改数据
user.age += 1;
user.greeting = `你好,${user.name},今年你 ${user.age} 岁了。`;
// 必须返回数据
return [user];
关键点: $input.first().json 是获取上一步数据的标准写法。最后一定要用 return [item] 的格式把数据传给下个节点。
2. 循环与数组处理:批量操作
当上一步传来的是一个数组(比如 10 条订单),Function 节点默认只会处理第一条。如果你想循环处理每一条数据,需要使用 for 循环。
假设输入是一个订单数组,我们想过滤掉金额小于 100 的订单:
const items = $input.all();
const results = [];
for (const item of items) {
const order = item.json;
// 只保留金额大于等于 100 的订单
if (order.amount >= 100) {
results.push(order);
}
}
// 返回所有符合条件的数据
return results.map(item => ({ json: item }));
这里使用了 $input.all() 来获取所有数据。通过循环判断后,我们需要手动构造返回格式,确保 n8n 能正确识别。
3. 多分支逻辑:动态路由数据
Function 节点最强大的地方在于它可以实现复杂的 IF/ELSE 逻辑,甚至分流数据。
例如,根据用户类型将数据发送到不同的输出端口(Output 1 或 Output 2):
const user = $input.first().json;
if (user.type === 'vip') {
// 返回到第一个输出(Output 1)
return [
{ json: user, pairedItem: 0 }
];
} else {
// 返回到第二个输出(Output 2)
return [
{ json: user, pairedItem: 0 }
];
}
注意:当你需要分流时,必须安装 Split Out 节点并连接到 Function 节点的输出端,才能看到多个输出分支的效果。
避坑指南:新手最容易报错的 3 个细节
在 N8N 大学的实战经验中,90% 的报错都源于以下三个原因:
1. 忘记返回数据
如果你在控制台看到了 Execution data missing 或者下个节点没有收到数据,大概率是你忘了写 return 语句。Function 节点不会自动传递数据,必须显式返回。
2. 数据格式错误
n8n 的节点间传递的是对象数组。如果你返回了一个字符串或者数字,下个节点可能会报错。请始终确保返回的是 { json: { ... } } 格式,或者直接返回 item 对象。
3. 混淆 $input 和 $item
在 n8n 的旧版本中,我们主要使用 $item。但在新版中(v1.0+),推荐使用 $input。如果你在看旧教程时发现代码报错,很可能是版本兼容性问题。建议统一使用 $input.first().json 来获取当前数据。
进阶技巧:如何调试你的代码?
写代码最痛苦的莫过于调试。在 n8n 的 Function 节点中,你有两个调试神器:
- console.log():直接在代码里写
console.log(user),运行后查看 n8n 的 Executions 面板,点击具体的运行记录,可以在左侧看到详细的日志输出。 - 节点数据预览:在编辑器界面,点击 Function 节点,右侧数据栏会显示输入和输出的数据结构。如果颜色变红,说明代码有语法错误。
笔者建议:先在本地用 VS Code 写好逻辑,测试通过后再粘贴到 n8n 中,效率会高很多。
FAQ 常见问题解答
Q1: Function 节点和 Code 节点有什么区别?
A: 在 n8n 中,它们本质上是同一个节点。只是 Function 通常是旧版的叫法,现在官方更倾向于称为 Code 节点。功能完全一致,都是用来编写 JavaScript 代码的。
Q2: 我完全不懂 JavaScript,能学会吗?
A: 能。n8n 的数据操作通常只涉及 JS 的基础语法(对象、数组、循环)。N8N 大学建议你先掌握 JSON 结构,能看懂数据层级,就能写出 80% 常用的代码。更复杂的逻辑可以交给 AI 辅助编写。
Q3: 为什么我的代码在测试时能跑,正式运行时报错?
A: 检查数据是否为空。在测试时,n8n 通常会模拟一条数据。但在正式运行中,如果上一步没有数据(空数组),$input.first() 就会报错。建议加上判断:if (!$input.first()) return [];。
总结与资源
Function 节点是 n8n 自动化流程中的“终极武器”。它不要求你成为全栈工程师,只要掌握基础的数据操作,就能极大提升 workflow 的灵活性。
**N8N大学** 的建议是:不要畏惧代码,从修改一个字段开始,慢慢尝试循环和判断。当你熟练掌握 Function 节点后,你会发现 n8n 几乎没有做不到的自动化。
参考资料:
- n8n 官方文档 - Code 节点示例
- MDN Web Docs - JavaScript 基础教程
- N8N大学社区 - 实战案例库