在用 n8n 搭工作流的时候,我经常看到有人对数据传递的理解有些模糊。其实只要搞清楚几个核心概念,n8n 的数据流就很好理解了。今天就把这些核心概念梳理一下。
数据的本质:JSON 对象流
n8n 中所有节点之间传递的数据,本质上就是一个或多个 JSON 对象。你可以把这些对象想象成在节点之间流动的”数据包”。
每个节点接收上一个节点的输出作为输入,处理它,然后产生自己的输出,传递给下一个节点。
数据结构:理解 items 和 JSON
当你查看任意一个节点的输出时,会看到一个类似这样的结构:
[ { "json": { "userId": 1, "id": 1, "title": "My First Task", "completed": false }, "binary": {}, "pairedItem": { "item": 0 } }, { "json": { "userId": 1, "id": 2, "title": " "My Second Task", "completed": true }, "binary": {}, "pairedItem": { "item": 1 } }]让我们分解这个结构:
数组 [ … ]:批次数据
数组里的每一个元素(每一个 JSON 对象)称为一个 item。
单个 item 的结构
每个 item 包含三个主要部分:
- json:这是最主要的数据部分。节点处理后的核心数据都在这里,比如 API 返回的数据、表格读取的行数据等。
- binary:如果节点处理或生成了二进制数据(如图片、PDF、音频),相关信息会存储在这里,通常是一个指向 n8n 临时存储的文件引用(文件名、类型、大小)。
- pairedItem:这个字段用于错误处理和运行时跟踪,记录当前 item 是由上游哪个 item 生成的。
节点对数据流的处理方式
1. 无输入 → 有输出
这类节点是工作流的起点,例如:
- Schedule Trigger:按计划触发,输出当前时间等信息
- Webhook Trigger:接收外部请求,输出请求的 payload
- Google Sheets (Read):从表格读取数据,输出多行数据(每个 item 代表一行)
它们凭空创建了初始的 items 数组。
2. 有输入 → 有输出
这类节点是工作流的核心处理单元,例如:
- Function:对传入的每个 item 执行自定义 JavaScript 代码
- Set:给传入的每个 item 添加、修改或删除 json 中的字段
- HTTP Request:使用传入 item 中的某个数据作为参数,向 API 发送请求
它们接收上游的 items,对其进行处理,然后输出新的、修改后的 items。
3. 有输入 → 无输出
这类节点是工作流的终点,例如:
- Google Sheets (Append):将传入 items 的 json 数据写入表格
- Email (Send):使用传入 item 中的数据作为邮件内容并发送
- SSH:执行某个命令
它们”消费”掉传入的 items,通常不再向下传递数据。
如何使用数据?表达式和占位符
这是最关键的操作部分。在节点的配置字段中引用上游传来的数据。
n8n 使用双大括号 {{ }} 作为表达式语法。在双大括号内部,可以使用强大的表达式编辑器,它提供了变量、函数和方法。
最常用的变量
- $json:代表当前正在处理的 item 的 json 部分
{{$json.title}}获取当前 item 中 title 字段的值{{$json["first-name"]}}获取带连字符的字段名
- $input:代表第一个输入节点的所有数据(不常用)
- $():用于从所有上游 items 中提取数据(常用于聚合操作)
{{ $("Webhook").all()[0].json.body }}获取名为 “Webhook” 的节点的第一个 item 的 body 数据
- **$node[“节点名称”].all()`:获取指定节点的所有输出 items
示例场景
- Webhook 节点接收一个 POST 请求,Body 是
{ "name": "Alice", "email": "[email protected]" },它会输出一个 item,其 json 为{ "name": "Alice", "email": "[email protected]" } - 下一个是 Function 节点,你想生成一句欢迎语,代码可以这样写:
const name = $json.name;items[0].json.welcomeMessage = `Hello, ${name}!`;return items;- 下一个是 Email 节点,你需要配置收件人、主题和正文:
- To 字段:
{{$json.email}}(来自上一个 Function 节点的输出) - Subject 字段:
Welcome Onboard! - Body 字段:
{{$json.welcomeMessage}}(Function 节点新创建的字段)
关键特性和最佳实践
一对一 vs 一对多
一个节点可以输出多个 items,下一个节点会依次处理每一个。例如,一个 “Read” 节点读取了 100 行表格,就会产生 100 个 items,下一个 “HTTP Request” 节点就会执行 100 次请求(除非你使用了循环或聚合功能)。
数据重塑
节点会改变数据流的结构:
- “Read” 节点可能输出 100 个 items
- “Aggregate” 节点可以把 100 个 items 合并成 1 个 item(包含一个数组)
- “Split Out” 节点可以把 1 个包含数组的 item 拆分成多个 item
调试技巧
点击节点之间的连接线,你可以查看该节点接收到的输入数据。这是调试工作流最重要的手段,务必善用。
错误处理
由于 pairedItem 的存在,当某个节点处理失败时,n8n 可以精确地定位是哪个上游数据项导致了问题,并可以选择是停止整个工作流还是继续处理其他 items。
总结
理解 n8n 数据传递,只需记住以下几点:
- 数据是流:数据以 items 数组的形式在节点间流动
- 核心是 JSON:每个 item 的核心数据在 json 对象中
- 使用表达式引用:在配置任何节点时,使用
{{ ... }}和表达式(如$json.fieldName)来动态获取上游数据 - 查看输入数据:点击连接线来调试和验证数据是否正确传递
掌握了这些,你就已经理解了 n8n 至少 80% 的核心工作机制。