数据调用手册:如何在 Code 节点中使用 $input.all(), $node[], $json 获取上下文?

2026-01-26 27 0

别再让 Code 节点变成“黑盒”:为什么你总是拿不到想要的数据?

笔者在 N8N大学 的社群里潜水时,发现一个高频痛点:很多同学把 n8n 的 Code 节点 当成了万能补丁,一遇到复杂的逻辑处理就往里塞,结果被那堆 $input$node 搞得晕头转向。

数据调用手册:如何在 Code 节点中使用 $input.all(), $node[], $json 获取上下文?

“为什么我上一个节点明明输出了数据,这里拿不到?”、“我想引用第三个节点的数据,怎么写?”……这些问题本质上不是代码写错了,而是没搞懂 n8n 的数据流上下文

今天,作为你的“学长”,N8N大学 带大家硬核拆解 Code 节点的三大核心武器:$input.all()$node[]$json。看完这篇,你不仅能搞定数据调用,还能写出更优雅、更高效的自动化逻辑。

一、摸清底细:Code 节点到底在处理什么?

在深入代码之前,先建立一个核心认知:Code 节点本质上就是一个“数据加工厂”。它接收上家的数据,加工后传给下家。

n8n 的数据流是基于“项(Item)”的。这意味着你要时刻清楚当前的代码是在处理哪一条数据。而那三个神秘的变量,就是你在工厂里取货、看图纸、甚至调用隔壁工厂库存的工具。

二、$json:当前数据的“快照”

这是你在 Code 节点中最常用,也最容易产生误解的变量。

1. 它是什么?
$json 代表的是当前正在被处理的这一项数据。你可以把它理解为当前数据对象的快捷引用。如果你在 Code 节点里直接操作 $json,n8n 会认为你修改了当前数据的结构。

2. 实战场景
假设上游节点传来一个 JSON,长这样:{"name": "小明", "age": 18}。你想加个字段叫 "school"。

// 在 Code 节点 (JavaScript) 中:
$json.school = "N8N大学"; 
// 输出结果:{"name": "小明", "age": 18, "school": "N8N大学"}

笔者提醒: 如果你的上游节点输出了多条数据(比如循环输出),$json 会随着循环自动切换指向当前的数据项。这是 n8n 强大的并行处理能力的基础。

二、$input.all():全盘托出的“历史记录”

如果 $json 是当前这一项,那 $input.all() 就是“把上家的所有家底都拿来”

1. 什么时候用它?
当你需要把上一个节点的所有输出一次性拿过来,进行汇总、过滤或计算时,$input.all() 就是你的首选。它返回的是一个数组

2. 常见误区
很多新手直接用 $input.first()$input.item(),但在处理批量数据时,$input.all() 才是真正的杀器。

3. 实战场景
场景:上家节点输出了 3 个用户数据,你想在 Code 节点里算出这 3 个人的平均年龄。

// 在 Code 节点 (JavaScript) 中:
const allItems = $input.all();
let totalAge = 0;
allItems.forEach(item => {
  totalAge += item.json.age;
});
const avgAge = totalAge / allItems.length;
return [{ json: { averageAge: avgAge } }];

看懂了吗?$input.all() 拿到了所有数据,然后我们用 JS 原生方法处理,最后返回一个新的数据结构给下一个节点。

三、$node[]:跨节点的“上帝视角”

这是 Code 节点最硬核、也是最容易被忽视的能力——打破数据流的线性限制

1. 它的语法
$node['节点名称'].json 或者 $node['节点名称'].item.json

2. 为什么需要它?
默认情况下,Code 节点只能看到上家(Immediate Predecessor)的数据。但很多时候,我需要拿到第 1 个节点的配置,或者第 3 个节点的计算结果,来处理当前的数据。

3. 实战场景:数据富化(Enrichment)
场景:Webhook 接收到一个用户 ID(假设 ID 为 1)。上游有一个 "Get User Info" 节点获取了全量用户列表。你想在 Code 节点里,根据 ID 找到对应的用户详情。

// 假设 "Get User Info" 节点输出了所有用户列表
// 当前 Code 节点接收到了 Webhook 的 ID
const targetId = $json.id; // 当前的 id
const allUsers = $node['Get User Info'].json; // 跨节点拿数据

const userInfo = allUsers.find(user => user.id === targetId);

// 返回找到的用户信息
return [{ json: userInfo }];

N8N大学 提示: 使用 $node[] 时,如果引用的节点输出了多条数据,你可能需要加上索引,如 $node['A'].json[0] 来获取第一条。但在大多数聚合场景下,n8n 会自动处理这种映射。

四、避坑指南:实战中容易报错的细节

1. 忘记返回值
Code 节点不是纯函数,它必须显式返回数据。如果你在代码里计算了结果,但忘记写 return,下一个节点将收不到任何数据,导致整个工作流中断。

2. 引用不存在的节点
使用 $node['节点名称'] 时,一定要确保节点名称完全一致(包括大小写和空格)。如果节点重命名了,代码不会报错,但会返回 undefined,导致后续逻辑崩盘。建议在调试模式下先 console.log($node) 看看结构。

3. 混淆 $json 和 $item().json
在简单的线性流程中,$json$item().json 经常可以互换。但当你处理复杂的多输入(Merge节点后)时,使用 $item(index, runIndex) 显式指定数据源会更加稳健。

FAQ:N8N大学 答疑时间

Q1: $input.all() 会不会导致性能问题?如果上家有 10 万条数据呢?
A: 会的。虽然 n8n 处理几万条数据没问题,但如果数据量极大(如几十万),一次性加载到内存中可能会导致 Node.js 内存溢出。这种情况下,建议使用 Split in Batches 节点先切分数据,或者尽量在数据库层面完成聚合。

Q2: 我想获取当前节点的配置信息,能用 $node 吗?
A: 不能。$node 只能引用流程中在当前节点**之前**执行的节点。你无法在 Code 节点 A 中引用 Code 节点 B,如果 B 在 A 之后。这是数据流向决定的。

Q3: 为什么我用 $node['A'].json 拿到的数据是空的?
A: 检查两个点:1. 节点 A 是否真的执行成功并有输出;2. 节点 A 是否在当前 Code 节点的执行路径上(例如,如果 A 和当前节点都在 IF 节点的不同分支里,是无法互相访问的)。

总结与资源

掌握了 $input.all()$node[]$json,你就掌握了 n8n Code 节点的任督二脉。

  • $json:聚焦当下,处理当前数据项。
  • $input.all():回顾过去,批量处理上游数据。
  • $node[]:纵观全局,跨节点调用特定数据。

不要害怕写代码,n8n 的 Code 节点是 JS 写的,但它的上下文对象非常友好。多试、多错、多看控制台输出,你很快就能像笔者一样,把复杂的逻辑优雅地塞进几行代码里。

想了解更多 n8n 进阶技巧?关注 N8N大学 (n8ndx.com),带你少走弯路,玩转自动化。

相关文章

安全加固:限制 n8n Code 节点访问文件系统与内网 IP (Sandbox 配置)
超越 SQLite:为什么生产环境必须连接 PostgreSQL 以及如何配置?
元数据获取:使用 $workflow.id 和 $execution.id 生成带追踪参数的回调链接
高并发架构:配置 Redis + n8n Worker 模式实现分布式任务处理
解决 OOM 崩溃:优化 n8n 大数据量处理时的内存占用 (Memory Leak) 技巧
多入口触发:如何让一个工作流同时支持 GET/POST 甚至多个不同路径的 Webhook?

发布评论