还在为数据流转头疼?Code 节点才是 n8n 的完全体
大家好,我是 N8N大学 的主编。很多刚接触 n8n 的朋友,习惯用拖拽节点来拼接流程。这没问题,但当你遇到稍微复杂点的数据处理——比如想把一列数据拼成一段话,或者要算个复杂的逻辑——纯节点流就会变得像盘丝洞一样乱糟糟。
这时候,**Code 节点**就是你的救星。它不是让你去写什么高深的后端代码,而是给你一个在流程里直接“捏造”数据的机会。今天这篇指南,咱们不讲废话,直接拆解 Code 节点的核心语法,特别是那个让无数新手抓狂的 runOnce 和 runForAll 模式。
Code 节点的“地基”:你必须知道的两个变量
在 n8n 的 Code 节点(默认使用 JavaScript)里,你只需要死死记住两个核心变量,就能搞定 90% 的需求。
第一个是 items。你可以把它理解为流水线上正在流动的“包裹”。n8n 的整个工作流就是围绕着这些“包裹”(数据行)运转的。你可以通过 items[0].json 来访问当前包裹里的具体内容。
第二个是 $item。这是 n8n 提供的一个特殊工具,用来获取上下文信息。比如你想知道当前是第几个流程跑,或者获取上一个节点的原始数据,都要靠它。
runOnce 模式:一次性搞定所有数据
很多新手一进 Code 节点就懵了,不知道该写什么。默认情况下,Code 节点是“逐条处理”的,但有时候我们需要“一次性处理”。这就轮到 runOnce 登场了。
在 Code 节点的“Execution”设置里,如果你选择 Run Once for All Items(或者在代码里通过特定写法),代码只会执行一次。这适合什么场景?
举个例子,假设你从数据库拉出了 100 条用户数据,你想把这 100 个人的名字拼成一个字符串发给 API。如果逐条跑,你得发 100 次请求,这不疯了吗?用 runOnce 模式,你可以在一次执行里遍历整个数组,拼接好字符串,然后只发一次请求。
// 这是一个简化的示例逻辑
const allNames = items.map(item => item.json.name).join(', ');
return [{ json: { names: allNames } }];
runForAll 模式:给每一条数据都“打个标签”
与 runOnce 相对的,就是 Run Once for Each Item(默认行为)。这种模式下,你的代码块会像流水线上的工人一样,对每一个经过的“包裹”重复执行 N 次。
这种模式最适合做“数据清洗”或者“添加字段”。比如你拿到一堆原始数据,只想提取其中的 ID,并且给每个 ID 前面加上统一的前缀。
在代码里,你需要返回一个包含处理后数据的数组。注意,这里有个坑(后面会讲):你返回的数据结构必须严格符合 n8n 的 { json: { ... } } 格式。
实战避坑:代码写对了,数据为啥丢了?
笔者见过太多朋友,代码逻辑跑通了,但下游节点接不到数据,或者数据量突然从 100 条变成了 1 条。这通常是因为没搞懂 n8n 的数据“吞吐”机制。
坑点一:Return 的写法。
在 runOnce 模式下,如果你返回的是 return { json: { ... } },n8n 可能会报错或者只输出一条。正确的写法是返回一个数组,哪怕只有一条数据: return [{ json: { ... } }]。
坑点二:Map 和 Filter 的误用。
如果你在代码里修改了 items,比如使用了 items.map(...),你必须确保最后返回的是一个新的数组。如果你只是修改了 items[0].json.key = 1 却没有返回任何东西,数据虽然变了,但流程可能不会把这种变化传递下去。
进阶技巧:如何在 Code 节点调用外部 API?
虽然 n8n 有专门的 HTTP Request 节点,但有时候我们需要在代码里根据逻辑动态调用 API。在 Code 节点里,你可以使用原生的 fetch。
但是,请注意,Code 节点默认是同步执行的。如果你在里面写了一个异步的 fetch 请求却没有等待(await)结果,n8n 可能会在请求还没返回时就结束了执行,导致下游节点拿到空数据。
正确姿势: 记得使用 async 和 await。如果是 runOnce 模式,你可以用 Promise.all 来并发请求,极大提升效率。
FAQ:新手最常见的三个疑问
Q1: 我的 JavaScript 代码在 Code 节点里报错了,怎么调试?
A: 别光看红色提示。点击节点运行结果右侧的 “Details” 或者看 Workflow Log,通常会有更详细的堆栈信息。最简单的调试方法是:在代码里多写几个 console.log(items),然后在 n8n 的执行历史里看输出日志。
Q2: Code 节点会影响 n8n 的性能吗?
A: 会,但通常影响不大。除非你在 Code 节点里写死循环,或者处理极大量数据(比如几万条)的复杂计算。如果是后者,建议在 Code 节点里只做逻辑判断,数据运算交给数据库或者专门的 Python 脚本节点。
Q3: 为什么我的 Code 节点输出的数据,下游节点读不到?
A: 检查你的输出格式。n8n 对数据格式很挑剔。确保你的输出是一个对象数组,每个对象都包含 json 属性。如果输出格式乱了,下游节点就会显示“Binary data”或者空值。
总结与资源
Code 节点是 n8n 从“好用”变成“强大”的关键分水岭。掌握了 runOnce 和 runForAll 的区别,理解了数据流转的格式,你就拥有了处理任意复杂业务逻辑的能力。
如果你还想深入了解更多 n8n 的骚操作,欢迎访问 N8N大学 (n8ndx.com)。这里有更多硬核的实战教程,帮你少走弯路,早日实现自动化自由。