Author
Published On
Oct 2, 2025
Category
n8n 变量与配置终极指南:精通环境变量、表达式与多输入数据处理
想让 n8n 工作流更灵活、更强大?掌握变量与配置是关键。本文深入解析 n8n 环境变量、内置表达式,并重点攻克多输入数据合并的难题,助你成为 n8n 配置高手。
在自动化系统中,灵活的配置能力是高效运维和安全保障的基础。对于强大的工作流自动化工具 n8n 来说,更是如此。无论是调整服务器行为,还是在工作流中动态处理数据,都离不开对变量与配置的深刻理解。
本文将系统介绍 n8n 的环境变量、内置变量与表达式,并重点说明 当一个节点有多个输入时如何正确获取与合并数据 的几种方式(包括官方推荐用法与 Code 节点示例),助你避开常见陷阱,构建更健壮的自动化流程。
1. 环境变量(自托管):掌控 n8n 服务器行为
对于自托管 n8n 的用户来说,环境变量是定制和优化 n8n 实例的利器。通过设置环境变量,你可以控制从数据存储、安全策略到本地化等方方面面。
以下是一些最常用且重要的环境变量:
变量 | 作用 | 常见取值/示例 |
N8N_DEFAULT_BINARY_DATA_MODE | 二进制数据存储模式 | default(内存 + 临时文件,默认)、filesystem。 |
EXECUTIONS_DATA_PRUNE | 是否滚动清理历史执行数据 | true/false。 |
EXECUTIONS_DATA_MAX_AGE | 执行数据最大保留时长(小时) | 例如 336(两周)。 |
EXECUTIONS_DATA_PRUNE_MAX_COUNT | 最多保留执行条数(0 表示不限制) | 如 10000。 |
N8N_DEFAULT_LOCALE | UI 默认语言(回退为 en) | 如 en、de;不支持区域化标识如 de-AT。 |
GENERIC_TIMEZONE | 实例时区(影响定时等) | 如 Asia/Shanghai。 |
N8N_BLOCK_ENV_ACCESS_IN_NODE | 是否禁止在表达式/Code 中访问 $env | true/false。设为 true 会禁用 $env。 |
⚠️ 重要提示: | ㅤ | ㅤ |
n8n 1.0 起移除了面向 UI 的 Basic Auth/JWT 登录(改为用户管理/SSO 等)。若你曾使用 N8N_BASIC_AUTH_* 来保护编辑器登录,这是旧设定,现已不适用。请改用用户管理/SSO。 | ㅤ | ㅤ |
操作提醒:设置环境变量后,务必重启 n8n 服务才能使配置生效。 | ㅤ | ㅤ |
2. 内置变量与表达式速查:释放工作流动态能力
n8n 的真正威力在于其动态数据处理能力,而这主要通过内置变量和表达式实现。无论是在节点的简单字段中,还是在复杂的 Code 节点里,这些变量和方法都是你构建智能工作流的基石。
2.1 当前节点输入(最常用)
$json:等同$input.item.json(在“逐条运行”模式下可用),是获取当前处理数据最快捷的方式。
$input.item/$input.all()/$input.first()/$input.last()/$input.params:提供更精细的输入数据访问控制。
- 通用性:这些 API 在 表达式和 Code 节点中都可用(Python Code 节点中使用
_input/_json同名变体)。
2.2 时间处理
$now、$today:返回 Luxon DateTime 对象,便于进行各种格式化和时间运算,如{{$now.toISO()}}。
2.3 跨节点取数据
$('节点名').all()/.first()/.last()/.params:让你能从工作流的任意位置获取其他节点的输出数据。
.itemMatching(i):Code 节点专属神器,用于“顺着 item 链接(item linking)”找到与当前第 i 个输入对应的上游 item,实现精准配对。
2.4 访问环境变量
$env.MY_ENV:在表达式或 Code 中直接读取预设的环境变量(前提是未被N8N_BLOCK_ENV_ACCESS_IN_NODE禁用)。
3. 多输入节点:如何同时获取并合并数据?
这是许多 n8n 用户进阶路上的“第一道坎”。当一个节点有多个输入时,如何正确地将它们合并处理?
核心事实(避免踩坑)
- 执行机制:一个节点有多个输入时,n8n 通常会为每个输入分别执行一次(或按 item 链接执行)。此时,
$json和$input.*只代表“本次执行对应的那个输入”。
$input不是函数:表达式里没有$input(1)这种函数。$input是一个对象,把它当函数调用会得到你遇到的经典错误:TypeError: $input is not a function。正确用法是$input.all()、input.first()等。 想要“在同一次执行中同时拿到多个上游的结果”,有两种官方认可的方式: A. 先用 Merge 节点把两路数据合成一路;B. 在表达式/Code 中直接用$('节点名')按名称取上游节点输出,必要时配合.itemMatching(i)精准配对。
4. 方案 A:用 Merge 节点统一输入(官方推荐)
这是最直接、最符合 n8n 设计理念的方式。当你希望下游节点只处理一条合并后的 item 或者成对合并两路列表时,使用 Merge 节点最省心。
- 多种模式:Merge 节点支持 Append、Combine(按字段、按位置)、全组合(Cartesian Product)、Choose Branch 等多种模式。常见的“按位置一一合并”在新版 UI 中归入
Combine→Merge by Position。
- Item Linking:Merge 的行为与 item 链接关系密切,它能智能地维持数据间的关联,确保合并后的数据流清晰可追溯。 优点:直观、无需编码、与 n8n 数据流模型完美契合。
5. 方案 B:在表达式/Code 中按节点名取数据
当无法或不便使用 Merge 节点时,你可以在目标节点的表达式或 Code 节点中,通过
$('上游节点名').all() 的方式主动获取任意上游节点的全部数据。
表达式示例:
{{$("HTTP Request").first().json.result}}{{$("DB Query").last().json.rows}}Code(JS)示例:提示:$('…') 系列在表达式与 Code 节点中均可用,且在 1.x 版本中对 item 链接的支持比旧的 $node["..."] 更一致。
6. Code 节点实战:多路 JSON 合并的正确姿势
下面我们通过三个常见场景,演示在 Code 节点中处理多输入的具体代码。
场景 1:两路各出一条,合并成一条(Run Once for All Item)
目标:将两个上游节点各自输出的第一条数据合并成一个新对象。
代码:
说明:该写法不依赖当前节点的多输入执行顺序,直接按名字取上游,简单直接。
场景 2:两路各出多条,按“位置”一一配对合并(Run Once for Each Item)
目标:两个上游节点输出数量相同的数据,按索引位置一一对应合并。
代码:
说明:
.itemMatching(i) 是 Code 节点专用的“沿 item 链接回溯”的方法,它能在多分支/合并之后,依然找回与当前第 i 条相匹配的上游 item,是保证数据准确配对的关键。场景 3:如果你明确希望“先合后用”
目标:在 Code 节点处理前,先用 Merge 节点将数据整合好。
步骤:
- 在 Code 节点前放置一个 Merge 节点(模式可选
Combine→Merge by Position或Merge by Fields)。
- Code 节点设置为
Run Once for Each Item。 代码:
提示:当合并策略、冲突字段优先级或去重策略比较复杂时,使用 Merge 节点通常比在 Code 中手动实现更直观可靠。
7. 常见表达式与函数速查
- 读取字段:
{{$json.id}}/{{$("Set").item.json.value}}
- 三元判断:
{{$json.name ? $json.name : "unknown"}}
- 默认值:
{{$json.x ?? "default"}}
- 时间:
{{$now.toISO()}}、{{$today.toISODate()}}
- 数据转换函数(如
toDateTime()、parseJson()等)是表达式编辑器提供的“Data transformation functions”,在 Code 节点中不可直接使用。
8. 常见错误与排查
错误信息 | 原因 | 解决方案 |
TypeError: $input is not a function | 把 $input 当函数调用(如 $input(1))。 | $input 是对象,用 $input.all()、$input.first()、$input.item。多上游请用 $("<节点>").… 或先 Merge。 |
拿不到另一条输入的数据 | 当前这次执行只关联其中一路输入。 | 用 Merge 整合,或在表达式/Code 中通过节点名取数,并在 Code 中配合 .itemMatching(i)。 |
访问 $env 为空 | 检查是否设置了 N8N_BLOCK_ENV_ACCESS_IN_NODE=true。 | 将该环境变量设为 false 或移除,然后重启 n8n。 |
9. 一图看懂:两种方案对比
说明:
- 方案 A(Merge):数据流清晰,下游节点处理简单,直接用
$json即可。
- 方案 B(直接取数):更灵活,无需额外节点,但在 Code 中需要使用
$('节点名')和.itemMatching(i)进行精准配对。
10. 结论
下面总结了多输入节点数据获取与合并的常用方法和注意事项:
- 单输入:直接用
$json/$input.*,简单高效。
- 多输入:
- 想要一次性看到两路数据 → 优先使用 Merge 节点。
- 不想 Merge 或需精准配对 → 在表达式/Code 中用
$('节点'),并在 Code 中用.itemMatching(i)。
- 避坑指南:永远不要写
$input(1),$input不是函数! 掌握这些变量与配置技巧,你的 n8n 工作流将不再局限于简单的线性任务,而是能够处理复杂、动态的业务逻辑,真正释放自动化的全部潜力。
关键词:n8n, n8n配置, n8n变量, n8n环境变量, n8n表达式, n8n多输入, n8n Merge, n8n Code节点, n8n教程, n8n自动化, n8n数据合并, itemMatching, n8n工作流








