n8n Function节点编写JavaScript代码:从零开始的实战入门指南

2026-01-29 9 0

别再被 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大学社区 - 实战案例库

相关文章

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

发布评论