表达式语法入门 · {{ }} 与 fx 模式
第 3 章 · 第 1 节
Section titled “{{ ... }} 的内部是 JavaScript”
表达式是 n8n 给静态节点装上的动态引擎。学会用它,节点的参数就能根据上游数据自动变化——这是从”写死的工作流”升级到”智能的工作流”的关键一跃。
两种模式:固定值 vs 表达式
Section titled “两种模式:固定值 vs 表达式”每个节点参数输入框都有一个 fx 小按钮(右上角)。点一下切换:
🔀 fixed-vs-expr.txt
【固定值模式】
输入: Hello World
发送: Hello World (字面量,不解释)
输入: {{ $json.name }}
发送: {{ $json.name }} (依然是字面量,不执行)
【表达式模式 fx】
输入: ={{ $json.name }}
发送: Alice (执行后的结果)
输入: =Hello {{ $json.name }}!
发送: Hello Alice! (混合字面量 + 表达式)
记忆口诀:表达式模式下的字符串以 = 开头——n8n 看到 = 才知道”这一整串里可能含表达式,扫一遍”。固定值模式下整串原样发送。
{{ ... }} 的内部是 JavaScript
Section titled “{{ ... }} 的内部是 JavaScript”{{ ... }} 双花括号里写任意 JavaScript 表达式,不是某种自定义 DSL:
💻 js-expressions.txt
{{ 1 + 1 }} → 2
{{ "hello".toUpperCase() }} → HELLO
{{ [1,2,3].reduce((a,b)=>a+b) }} → 6
{{ new Date().getFullYear() }} → 2026
{{ true && 'yes' }} → yes
{{ $json.x > 10 ? 'big' : 'small' }} → big / small
整个 JS 标准库都能用。所以表达式 ≈ JavaScript 的 inline 模板。
n8n 内建变量速查
Section titled “n8n 内建变量速查”{{ }} 里可以用普通 JS 变量名(其实是 n8n 注入的全局对象):
| 变量 | 含义 |
|---|---|
$json | 当前正在处理的 Item 的 JSON |
$('NodeName') | 引用另一个节点(拿它的输出) |
$node['NodeName'] | 同上,老语法(已不推荐) |
$now | 当前时间(Luxon DateTime 对象) |
$today | 今天 00:00(Luxon DateTime) |
$workflow | 当前 workflow 元信息(id/name/active) |
$execution | 本次 execution 元信息(id/mode) |
$env | 环境变量(自托管才有) |
$input | 节点的输入(多输入节点常用) |
$itemIndex | 当前 item 在数组里的下标(从 0 起) |
表达式编辑器(点 fx 后的弹出框)
Section titled “表达式编辑器(点 fx 后的弹出框)”很多输入框点 fx 后会弹出一个表达式编辑器——左边写表达式,右边实时显示求值结果。这是新手最该学会的工具:
✏ expr-editor.txt
┌──────────────────────────┬─────────────────────┐
│ Expression │ Result │
│ │ │
│ Hello {{ $json.name }}! │ Hello Alice! │
│ │ │
│ {{ $now.toISO() }} │ 2026-05-13T10:23.. │
│ │ │
│ {{ $json.age + 1 }} │ 31 │
└──────────────────────────┴─────────────────────┘
错误时右边会显示红色错误信息,方便定位。
调试任何表达式都先在这里跑通,再放回节点里。
表达式的 3 个进阶语法
Section titled “表达式的 3 个进阶语法”1 · 多行表达式(IIFE)
Section titled “1 · 多行表达式(IIFE)”{{ ... }} 里只允许写表达式,不能写 if/for。但可以包一个立即执行函数:
🎯 iife-expr.txt
{{
(() => {
const items = $json.items;
let total = 0;
for (const it of items) total += it.price;
return total;
})()
}}
但这么写就太丑了——复杂逻辑用 Code 节点。
2 · 字符串里嵌多个表达式
Section titled “2 · 字符串里嵌多个表达式” 🎯 multi-expr.txt
=Hello {{ $json.first }} {{ $json.last }}, you are {{ $json.age }} years old.
每个 {{ }} 单独求值,结果拼回字符串。
3 · 表达式调用 n8n 内置工具函数
Section titled “3 · 表达式调用 n8n 内置工具函数”n8n 注入了一些便捷工具:
🔧 helpers.txt
{{ $now.minus({ days: 7 }).toISO() }} → 7 天前的 ISO 时间
{{ $jmespath($json, 'items[*].name') }} → JMESPath 查询
{{ $randomString(8) }} → 随机 8 位串
{{ $fromAI('field', 'description') }} → 在 AI Tool 节点里取参数
何时该用表达式、何时不该
Section titled “何时该用表达式、何时不该”| ✅ 该用 | ❌ 不该用 |
|---|---|
| URL/路径里插入上游数据 | 表达式里写超过 3 行逻辑(用 Code 节点) |
| 字段值动态拼接 | 多分支判断(用 IF / Switch 节点) |
| 简单条件值(三元运算符) | 数据库查询(用 SQL 节点) |
| 时间/字符串格式化 | 循环大数据(用 SplitInBatches) |
本节要点回顾
Section titled “本节要点回顾”- 两种模式:固定值(字面量)vs 表达式 fx(动态求值)
- 表达式模式下字符串以
=起头,{{ ... }}内是任意 JavaScript - n8n 注入的全局变量:
$json/$('Name')/$now/$workflow等 - 调试表达式去表达式编辑器实时看结果
- 复杂逻辑用 Code 节点;多分支用 IF/Switch
下一节深入讲引用其他节点数据的语法细节。