嘿,朋友!我是 N8N大学 的主编。如果你正在阅读这篇文章,大概率是因为你已经迈过了拖拽节点的“新手期”,开始觉得标准节点的逻辑不够灵活,想要在 n8n 的世界里真正“掌控一切”。
没错,今天我们要聊的就是 n8n 的“核武器”——Function 节点。
很多初学者看到“代码”两个字就头大,但别慌。在 n8n 里,写代码不是为了炫技,而是为了解决那些“拖拖拽拽”解决不了的复杂逻辑。比如,你需要处理数组、计算复杂的数学公式,或者清洗一堆乱七八糟的 JSON 数据。这时候,Function 节点就是你的救星。
作为 N8N大学 的首席主编,我见过太多人在这个节点上踩坑。今天,我就把 8 年的实战经验浓缩在这篇教程里,手把手教你如何编写自定义 JavaScript 代码,让你的自动化流程瞬间起飞。
场景导入:为什么要学 Function 节点?
想象一下这个场景:你需要把一堆从 API 拉下来的数据,变成一份整洁的 Excel 表格。标准节点只能帮你提取单个字段,但如果你想给字段重命名、计算百分比、或者把数组里的数据拼接成一句话——标准节点会让你点到手抽筋。
这时候,Function 节点就是那个“瑞士军刀”。它允许你在流程中直接运行 JavaScript 代码。这不仅仅是省事,更是让你的自动化具备了“思考”的能力。
准备工作:你的代码环境
在开始写代码之前,你需要准备两样东西:
- 一个 n8n 实例:无论是 Cloud 版还是自托管版(推荐 Docker 部署)。
- 基础的 JavaScript 知识:不需要你是全栈大神,但至少要懂变量、数组、对象和基本的循环。
如果你是零基础,别怕。n8n 的 Function 节点使用的是 JavaScript (Node.js 环境),而且它封装了很多方便的操作方法。
核心实操:从“Hello World”到实战数据处理
我们将通过三个步骤,从简单到复杂,彻底征服 Function 节点。
步骤一:认识界面与“Hello World”
首先,在你的 n8n 画布上添加一个 Function 节点。双击打开,你会看到一个代码编辑框。
在 n8n 的 Function 节点中,所有的逻辑都围绕着 items 这个变量。它是一个数组,包含了上一个节点传递过来的所有数据。
让我们写第一行代码:
return [{
json: {
message: "Hello, N8N University!",
timestamp: new Date().toISOString()
}
}];
点击运行,你会发现输出端多了一条数据。这就是 Function 节点的核心规则:你必须返回一个数组,数组里包含对象,对象里必须有 json 属性。
步骤二:读取与修改上游数据
现在我们来点实战的。假设上游节点传来了一个包含用户信息的数据包,我们想把名字改成大写,并增加一个状态标记。
假设输入数据是这样的:
[
{ "json": { "name": "alice", "age": 25 } },
{ "json": { "name": "bob", "age": 30 } }
]
在 Function 节点中,我们可以这样写:
// 遍历所有传入的 items
for (const item of items) {
// 获取原始数据
const originalName = item.json.name;
// 修改数据
item.json.name = originalName.toUpperCase();
item.json.status = "PROCESSED";
}
// 必须返回修改后的 items
return items;
这段代码非常直观。我们使用了 for...of 循环遍历每一个 item,直接在原对象上修改属性。最后,返回整个 items 数组,数据就会流向下一个节点。
步骤三:处理复杂逻辑与数组操作
这是 Function 节点最强大的地方。比如,你从 API 获取了一个商品列表,想要计算总价并筛选出价格高于 100 的商品。
let filteredItems = [];
for (const item of items) {
const products = item.json.products; // 假设这是一个商品数组
// 使用 filter 和 map 处理数据
const expensiveProducts = products.filter(p => p.price > 100);
// 计算总价
const total = expensiveProducts.reduce((sum, p) => sum + p.price, 0);
// 构建新的输出对象
filteredItems.push({
json: {
originalOrderId: item.json.id,
qualifiedCount: expensiveProducts.length,
totalValue: total
}
});
}
return filteredItems;
看到了吗?在这里,你可以使用所有原生的 JavaScript 方法(如 filter, map, reduce)。这让 n8n 的数据处理能力几乎无限大。
避坑指南:实战中容易报错的细节
在 N8N大学 的教学过程中,我发现新手最容易在以下两个地方翻车:
- 忘记返回值或返回格式错误:Function 节点必须返回一个数组。如果你只写了逻辑但没有
return items;,流程会报错。如果你返回了单个对象而不是包裹在数组里,下游节点可能无法识别。 - 数据类型陷阱:从上游节点获取的数据(如
item.json.id)可能是字符串格式。如果你需要做数学运算,一定要记得用parseInt()或Number()转换,否则会出现 "1" + "1" = "11" 而不是 2 的尴尬情况。
另外,一个小技巧:如果你在调试复杂的数组逻辑,想查看中间结果,可以在代码中使用 console.log(item.json),然后在 n8n 的 Executions(执行历史)中查看日志。这能帮你快速定位问题。
FAQ 问答
Q1: Function 节点和 Code 节点有什么区别?
A: 在 n8n 的旧版本中区分过,但在当前版本(1.0+)中,Function 节点就是用来写 JavaScript 代码的节点。还有一个 Code 节点(Code in Python) 是专门用来写 Python 代码的,功能类似。
Q2: 我的代码在本地测试没问题,但在 n8n 里报错,为什么?
A: n8n 运行在 Node.js 环境中,且是沙箱隔离的。确保你的代码没有引用外部的 npm 包(除非你手动安装了依赖),并且遵循了 n8n 的数据结构(必须返回包含 json 对象的数组)。
Q3: Function 节点执行效率如何?
A: 对于简单逻辑,它非常快。但如果你在 Function 节点里写了大量的同步循环处理成千上万条数据,可能会阻塞整个工作流。处理大批量数据时,建议配合 Split in Batches 节点使用。
总结与资源
Function 节点是 n8n 的灵魂所在。它打破了标准节点的限制,赋予了自动化流程真正的“逻辑思维”能力。从简单的数据格式化,到复杂的业务规则计算,掌握它意味着你的自动化水平从“入门”进阶到了“精通”。
记住,代码只是工具,解决问题才是目的。不要为了写代码而写代码,当你发现拖拽节点已经无法优雅地解决问题时,Function 节点的大门永远为你敞开。
如果你想查看更多 n8n 的实战案例和节点配置技巧,欢迎访问 N8N大学 (n8ndx.com),那里有更多硬核的实战教程等你来挖。