n8n Function节点代码示例:2024年最常用的5个JavaScript实战脚本

2026-01-29 17 0

别再硬背Function节点语法了,笔者给你这5个脚本直接复制粘贴

在N8N大学的后台私信里,问得最多的问题之一就是:“Function节点到底怎么写才不出错?”

很多刚接触n8n的朋友,一看到代码块就发怵。其实,n8n的Function节点并没有你想的那么难。它本质上就是处理数据的“万能胶水”。今天,笔者不讲枯燥的语法,直接给你5个2024年实战中最高频的JavaScript脚本。这些脚本我都亲自在生产环境跑过,你只需要根据注释微调,就能搞定90%的数据处理需求。

准备工作:你的代码沙盒

在开始之前,请确保你已经新建了一个Workflow,并成功添加了Function节点。为了测试代码效果,建议在Function节点前加一个Set节点(或者HTTP Request节点)用来模拟数据输入。

这些脚本主要利用了n8n特有的两个对象:

  • items: 包含了流入节点的所有数据项。
  • $input: 访问输入数据的另一种方式(新版n8n推荐)。

实战脚本一:数据格式标准化(数组转对象)

场景: 你从API获取了一个包含嵌套对象的数组,但你想提取其中的特定字段,并将结果扁平化,方便写入Google Sheets或数据库。

脚本:

// 从输入数据中遍历每一项
return items.map(item => {
  // 假设原始数据结构是 { json: { user: { id: 1, name: "张三" }, status: "active" } }
  const userData = item.json.user;
  
  // 返回一个新的对象,只保留我们需要的字段
  return {
    json: {
      userId: userData.id,
      userName: userData.name,
      status: item.json.status,
      processedAt: new Date().toISOString() // 增加一个处理时间戳
    }
  };
});

解析: 这里的items.map是核心。它会遍历所有输入项,并返回一个新的数组。记住,n8n的Function节点必须返回一个数组格式的数据,这样下游节点才能正确接收。

实战脚本二:条件逻辑与数据过滤

场景: 你有一批订单数据,只想让金额大于1000元的订单继续流转,其他的直接丢弃(或走另一条路)。

脚本:

// 定义一个空数组来存放符合条件的数据
const filteredItems = [];

// 遍历所有输入项
for (const item of items) {
  // 获取订单金额(假设字段名为 amount)
  const amount = item.json.amount;
  
  // 如果金额大于1000,则保留
  if (amount > 1000) {
    filteredItems.push(item);
  }
}

// 返回过滤后的数组
return filteredItems;

解析: 这种写法比直接在IF节点里判断更灵活。你可以在Function节点里处理复杂的逻辑,比如多重判断(金额>1000 且 状态为 "paid")。如果数组为空,n8n会自动停止后续流程,非常智能。

实战脚本三:字符串拼接与文本处理

场景: 你需要把散落在不同字段的地址信息(省、市、区、详细地址)合并成一个完整的字符串,用于生成邮件正文。

脚本:

return items.map(item => {
  const json = item.json;
  
  // 使用模版字符串(Template Literals)优雅拼接
  // 注意:这里使用了可选链操作符 ?. 防止字段缺失报错
  const fullAddress = `${json.province ?? ''}${json.city ?? ''}${json.district ?? ''}${json.address ?? ''}`;
  
  // 或者,如果你想直接修改原数据,可以这样写:
  item.json.fullAddress = fullAddress;
  
  // 返回修改后的 item
  return item;
});

解析: 笔者特别喜欢用??(空值合并运算符)来处理数据,这能避免因为某个字段为空而导致的拼接中断。这是2024年JavaScript的主流写法,n8n完全支持。

实战脚本四:时间戳转换与日期格式化

场景: API返回的时间通常是Unix时间戳(如 1715000000),你需要将其转换为可读的日期格式(如 2024-05-07 10:00:00)。

脚本:

return items.map(item => {
  // 假设时间戳字段名为 timestamp
  const timestamp = item.json.timestamp;
  
  // 创建Date对象(注意乘以1000,因为JS时间戳是毫秒级)
  const date = new Date(timestamp * 1000);
  
  // 格式化为本地时间字符串
  const formattedDate = date.toLocaleString('zh-CN', {
    timeZone: 'Asia/Shanghai' // 强制指定时区,避免服务器时区不一致
  });
  
  item.json.readableDate = formattedDate;
  
  return item;
});

解析: 时区问题是n8n自动化中最大的坑之一。如果n8n部署在海外服务器,默认时区可能是UTC。务必像代码中那样,显式指定timeZone,或者在n8n的实例设置中全局配置时区。

实战脚本五:生成简单的哈希/校验码

场景: 你需要为每条数据生成一个简单的唯一标识符,或者对敏感信息进行简单的MD5加密(注意:生产级加密建议用HTTP Request节点调用专门的API)。

脚本:

const crypto = require('crypto');

return items.map(item => {
  // 假设我们要对 id 和 name 进行哈希
  const sourceString = `${item.json.id}${item.json.name}`;
  
  // 创建 MD5 哈希
  const hash = crypto.createHash('md5').update(sourceString).digest('hex');
  
  item.json.checksum = hash;
  
  return item;
});

解析: n8n的Function节点基于Node.js环境运行,这意味着你可以使用Node.js内置的模块,如cryptofs(虽然在云版受限)、path等。这是它比Zapier等封闭平台强大得多的地方。

避坑指南:Function节点常见报错

在N8N大学的实战群中,新手最容易遇到以下两个报错:

1. "Cannot read property 'json' of undefined"

原因: 你可能在遍历items时,忽略了n8n数据流的机制。如果你前面的节点没有输出数据,items就是空的。

解决: 在代码开头加个判断:if (items.length === 0) return [];。这能防止代码在没有数据流入时崩溃。

2. 返回值格式错误

原因: Function节点的输出必须是数组。如果你习惯写return { a: 1 },n8n会报错。

解决: 永远记得返回数组。即使是单条数据,也要包裹在数组里:return [{ json: { a: 1 } }]

FAQ 高频问题解答

Q1: Function节点和Set节点有什么区别?
A: Set节点适合简单的字段映射(把A字段值赋给B字段),不需要写代码。Function节点适合复杂的逻辑处理、循环、字符串拼接或调用Node.js原生模块。简单问题用Set,复杂逻辑用Function。

Q2: 我能在Function节点里发送HTTP请求吗?
A: 可以,但不推荐。虽然你可以用Node.js的axiosfetch,但这样会失去n8n的重试机制和可视化监控。建议使用专门的HTTP Request节点,更稳定且易于维护。

Q3: 为什么我的代码在测试时能跑,运行时就报错?
A: 检查你的数据结构。测试模式下可能只有一条数据,而实际运行时可能是多条。确保你的代码使用了items.mapfor (const item of items)来处理数组,而不是直接操作单个对象。

总结与资源

Function节点是n8n的灵魂,它赋予了你无限的扩展能力。掌握上述5个脚本模板,你已经能解决日常工作中80%的数据清洗和转换任务。

如果你还在为复杂的JSON结构头疼,或者想学习更多高级的Node.js技巧,欢迎关注N8N大学 (n8ndx.com)。我们不仅提供代码,更提供解决实际问题的思路。

记住,自动化不是为了炫技,而是为了把你从重复劳动中解放出来。去试试这些脚本吧,你会发现n8n比你想象的更强大。

相关文章

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

发布评论