n8n Function节点:编写自定义JavaScript代码的实战教程

2026-01-28 27 0

嘿,朋友!我是 N8N大学 的主编。如果你正在阅读这篇文章,大概率是因为你已经迈过了拖拽节点的“新手期”,开始觉得标准节点的逻辑不够灵活,想要在 n8n 的世界里真正“掌控一切”。

没错,今天我们要聊的就是 n8n 的“核武器”——Function 节点

很多初学者看到“代码”两个字就头大,但别慌。在 n8n 里,写代码不是为了炫技,而是为了解决那些“拖拖拽拽”解决不了的复杂逻辑。比如,你需要处理数组、计算复杂的数学公式,或者清洗一堆乱七八糟的 JSON 数据。这时候,Function 节点就是你的救星。

作为 N8N大学 的首席主编,我见过太多人在这个节点上踩坑。今天,我就把 8 年的实战经验浓缩在这篇教程里,手把手教你如何编写自定义 JavaScript 代码,让你的自动化流程瞬间起飞。

场景导入:为什么要学 Function 节点?

想象一下这个场景:你需要把一堆从 API 拉下来的数据,变成一份整洁的 Excel 表格。标准节点只能帮你提取单个字段,但如果你想给字段重命名、计算百分比、或者把数组里的数据拼接成一句话——标准节点会让你点到手抽筋。

这时候,Function 节点就是那个“瑞士军刀”。它允许你在流程中直接运行 JavaScript 代码。这不仅仅是省事,更是让你的自动化具备了“思考”的能力。

准备工作:你的代码环境

在开始写代码之前,你需要准备两样东西:

  1. 一个 n8n 实例:无论是 Cloud 版还是自托管版(推荐 Docker 部署)。
  2. 基础的 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大学 的教学过程中,我发现新手最容易在以下两个地方翻车:

  1. 忘记返回值或返回格式错误:Function 节点必须返回一个数组。如果你只写了逻辑但没有 return items;,流程会报错。如果你返回了单个对象而不是包裹在数组里,下游节点可能无法识别。
  2. 数据类型陷阱:从上游节点获取的数据(如 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),那里有更多硬核的实战教程等你来挖。

相关文章

n8n Wait节点在数据同步中的延迟控制实战
n8n Wait节点免费版:我能用它实现定时任务吗?
n8n Error Handling节点:当自动化流程“翻车”时,如何让它自动“扶起来”?
n8n Error Handling节点报错常见问题解决
当n8n流程意外中断,Error Handling节点如何配置才能优雅降级?
n8n Error Handling节点和Try/Catch节点,到底该怎么选?

发布评论