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)
ende;不支持区域化标识如 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 用户进阶路上的“第一道坎”。当一个节点有多个输入时,如何正确地将它们合并处理?

核心事实(避免踩坑)

  1. 执行机制:一个节点有多个输入时,n8n 通常会为每个输入分别执行一次(或按 item 链接执行)。此时,$json$input.* 只代表“本次执行对应的那个输入”
  1. $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 中归入 CombineMerge 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 节点将数据整合好。 步骤
  1. 在 Code 节点前放置一个 Merge 节点(模式可选 CombineMerge by PositionMerge by Fields)。
  1. 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工作流
Loading...
数字Baby
数字Baby
AIGC加速人类文明
公告
🎉Dify/n8n视频课程已经上线🎉
-- 感谢您的支持 ---
👏欢迎体验👏
🎉更多惊喜🎉
咨询微信:myaigcpro