核心心智模型 · Item / JSON / 迭代
本节是 n8n 学习者最容易忽视、却最关键的一节。理解这里讲的三件套——Item / JSON / 迭代——之后你看任何 workflow 都能”读懂它在做什么”。
n8n 里的数据,永远是”一个由 JSON 对象组成的数组”——每个对象叫一个 Item,每个节点对数组里的每一个 Item 各自执行一次。
这一句话密度有点大,我们拆开看。
Item 是什么
Section titled “Item 是什么”打开任意一个执行过的节点,看它的输出 tab,你会看到类似这样的结构:
整体是一个数组([...])——这是 n8n 数据的”标准包装”。
每个元素是一个对象({...})——这就是一个 Item。
上面这个节点的输出有 3 个 Items。
节点会”对每个 Item 跑一遍”
Section titled “节点会”对每个 Item 跑一遍””最关键的一点:下一个节点接到这个数组后,默认会对数组里的每一项各自执行一次。
举个例子,如果下一个节点是 “HTTP Request”(去 API 查这个人),它会发 3 次请求:
# HTTP Request 节点 · URL 配置为 …/users/{{ $json.name }} ▶ run 1: GET /users/Alice → { … } ▶ run 2: GET /users/Bob → { … } ▶ run 3: GET /users/Carol → { … } → 输出:仍是 3 个 Items 的数组
这是 n8n 跟传统编程最大的区别:你不需要写 for 循环——节点自动迭代。
$json 是 “当前正在处理的那个 Item”
Section titled “$json 是 “当前正在处理的那个 Item””回到刚才的 {{ $json.name }}。这个表达式在节点对每个 Item 处理时,$json 自动变成那个 Item 的内容:
| 迭代第几次 | $json 是 | $json.name 求值为 |
|---|---|---|
| 第 1 次 | { "name": "Alice", "age": 30 } | "Alice" |
| 第 2 次 | { "name": "Bob", "age": 25 } | "Bob" |
| 第 3 次 | { "name": "Carol", "age": 28 } | "Carol" |
这就是 n8n 表达式的灵魂——$json 不是固定值,它跟着迭代变化。
引用”上一个节点”和”任意节点”
Section titled “引用”上一个节点”和”任意节点””$json 只引用正前方节点。如果你想引用更早的节点,用 $('NodeName'):
这套引用语法在第 3 部分会展开讲。这里先有个概念就行。
单 Item 还是多 Item?
Section titled “单 Item 还是多 Item?”不是所有节点都输出多 Item。比如:
- Manual Trigger → 永远输出 1 个空 Item(
[{}]) - HTTP Request GET 单个资源 → 1 个 Item
- Google Sheets 读 100 行 → 100 个 Items
- Webhook 收到一次请求 → 1 个 Item
你的工作流逻辑通常是:先从某处拿”一堆 Items”,然后让后续节点对每个迭代处理。
演示:两节点流水
Section titled “演示:两节点流水”设想一个真实场景:
Node A · Google Sheets: // 读出一张 “客户” 表 → 输出 50 个 Items [{ “email”: “a@x.com”, “name”: “Alice” }, … 49 more] Node B · Send Email: // To 字段:{{ $json.email }} // Subject 字段:Hello {{ $json.name }} ▶ 自动发送 50 次邮件
你没写一行循环代码——50 个 Items 自动让 Node B 跑了 50 次。这就是 n8n 的核心抽象魅力。
本节要点回顾
Section titled “本节要点回顾”- n8n 数据 = JSON 对象数组,每个对象是一个 Item
- 节点默认 对每个 Item 各自执行一次(自动迭代)
$json指代”当前正在处理的那个 Item”- 引用其他节点:
$('NodeName').first().json.field - 没有
for循环——迭代是 n8n 的内建行为
下一节聊聊一次”执行”到底发生了什么 —— Execution 机制。