n8n 的表达式(Expressions)是一个强大的功能,让你能够动态设置节点参数、转换数据、执行条件判断。简单来说,表达式让你用最少的代码完成复杂的数据处理,避免创建多余的节点。
表达式 是用 {{ ... }} 包裹的动态代码,可以在 n8n 的几乎所有节点参数中使用。它允许你:
场景:你需要从 API 获取用户数据,然后提取其中的 email 字段。
❌ 不用表达式的做法:
✅ 用表达式的做法:
{{ $json.email }}在 n8n 中使用表达式只需三步:
💡 技巧:点击参数旁的
fx按钮快速打开表达式编辑器
当你点击 "Open expression editor" 时,会进入一个强大的编辑器,具有:
| 变量 | 说明 | 示例 |
|---|---|---|
$json | 当前项的 JSON 数据(最常用) | {{ $json.name }} |
$input.item | 当前输入项的完整数据 | {{ $input.item.json.email }} |
$input.all() | 所有输入项的数组 | {{ $input.all().length }} |
$input.first() | 第一个输入项 | {{ $input.first().json.id }} |
$input.last() | 最后一个输入项 | {{ $input.last().json.status }} |
假设你的 Webhook 收到这样的数据:
{
"body": {
"user": {
"name": "张三",
"email": "zhangsan@example.com",
"city": "北京"
}
}
}你想提取 城市名称,可以这样写:
// 方法1:使用点符号
{{ $json.body.user.city }}
// 方法2:使用中括号
{{ $json['body']['user']['city'] }}
// 两种方法都返回:北京// 转换为大写
{{ $json.name.toUpperCase() }}
// 输入:john → 输出:JOHN
// 转换为小写
{{ $json.text.toLowerCase() }}
// 截取字符串
{{ $json.email.substring(0, 5) }}
// 输入:zhangsan@example.com → 输出:zhang
// 替换文本
{{ $json.title.replace('旧词', '新词') }}
// 分割字符串
{{ $json.tags.split(',') }}
// 输入:"标签1,标签2,标签3" → 输出:["标签1", "标签2", "标签3"]
// 去除空格
{{ $json.input.trim() }}// 基础运算
{{ $json.price * 1.1 }} // 增加10%
{{ $json.total / 2 }} // 除以2
{{ $json.a + $json.b }} // 两数相加
// 比较操作
{{ $json.age > 18 }} // 返回 true 或 false
// 数学函数
{{ Math.round($json.price) }} // 四舍五入
{{ Math.max($json.a, $json.b) }} // 取最大值
{{ Math.min(5, 10, 3) }} // 取最小值// 三元运算符(最常用)
{{ $json.age >= 18 ? '成年' : '未成年' }}
// 多层条件
{{ $json.score >= 90 ? '优秀' : $json.score >= 60 ? '及格' : '不及格' }}
// 检查值是否存在
{{ $json.status == 'active' ? '激活' : '未激活' }}// 获取当前时间
{{ $now.toISO() }}
// 输出:2025-12-05T10:51:00.000Z
// 获取今天日期
{{ $today.toISODate() }}
// 输出:2025-12-05
// 格式化日期
{{ $now.toFormat('YYYY-MM-DD HH:mm:ss') }}
// 输出:2025-12-05 10:51:00
// 格式化日期(中文)
{{ $now.toFormat('yyyy年MM月dd日') }}
// 输出:2025年12月05日// 提取电子邮件地址
{{ $json.text.match(/[\w.-]+@[\w.-]+\.\w+/)[0] }}
// 提取所有数字
{{ $json.text.match(/\d+/g) }}
// 输入:"我有2个苹果和3个橙子" → 输出:["2", "3"]
// 替换(使用正则)
{{ $json.text.replace(/\s+/g, '-') }}
// 输入:"hello world test" → 输出:"hello-world-test"当数据结构复杂时,用 $jmespath() 提取数据更优雅:
// 提取嵌套数据
{{ $jmespath('user.profile.email', $json) }}
// 筛选数组中的特定项
{{ $jmespath('users[?age > `18`].name', $json) }}
// 返回所有年龄大于18的用户名
// 排序
{{ $jmespath('sort_by(users, &age)', $json) }}// 设置默认值
{{ $ifEmpty($json.description, '没有描述') }}
// 如果 description 为空,则返回 '没有描述'
// 条件判断
{{ $if($json.status == 'success', 'OK', 'Error') }}
// 根据条件返回不同的值// 获取数组长度
{{ $json.items.length }}
// 检查数组是否包含某个值
{{ $json.tags.includes('重要') }}
// 数组映射(转换每个元素)
{{ $json.users.map(u => u.name) }}
// 输入:[{name: 'Alice'}, {name: 'Bob'}]
// 输出:['Alice', 'Bob']
// 数组筛选
{{ $json.products.filter(p => p.price > 100) }}
// 返回价格大于100的产品
// 数组求和
{{ $json.amounts.reduce((sum, a) => sum + a, 0) }}有时你需要访问不是直接前一个的节点的数据:
// 语法:$('节点名称').item.json.字段
{{ $('HTTP Request').item.json.userId }}
// 访问节点的所有输出项
{{ $('Get Users').all() }}
// 获取第一个输出项
{{ $('API Call').first().json.id }}假设有两个节点:
{ id: 1, name: 'Alice' }{ orderId: 101, amount: 500 }在 Set 节点中,你可以这样合并数据:
// 创建新字段,包含两个节点的数据
{
userId: {{ $('Get User').item.json.id }},
userName: {{ $('Get User').item.json.name }},
orderTotal: {{ $('Get Orders').item.json.amount }}
}
// 结果:
// {
// userId: 1,
// userName: 'Alice',
// orderTotal: 500
// }你有一个 Webhook 接收表单数据,需要:
{
"form_id": "123",
"first_name": "John",
"last_name": "Doe",
"email_address": "john@example.com",
"age": "25",
"country": "USA",
"subscribe": "yes"
}在 Set 节点中,使用以下表达式创建新结构:
// 字段1:完整名字
fullName: {{ $json.first_name + ' ' + $json.last_name }}
// 字段2:规范化邮箱
email: {{ $json.email_address.toLowerCase().trim() }}
// 字段3:转换年龄为数字
age: {{ parseInt($json.age) }}
// 字段4:布尔值转换
isSubscribed: {{ $json.subscribe === 'yes' ? true : false }}
// 字段5:添加处理时间
processedAt: {{ $now.toISO() }}
// 字段6:添加国家代码
country: {{ $json.country.toUpperCase() }}{
"fullName": "John Doe",
"email": "john@example.com",
"age": 25,
"isSubscribed": true,
"processedAt": "2025-12-05T10:51:00.000Z",
"country": "USA"
}$json 前缀// ❌ 错误
{{ name }}
// ✅ 正确
{{ $json.name }}// ❌ 可能报错
{{ $json.user.profile.phone }} // 如果中间某个字段不存在
// ✅ 安全做法
{{ $json.user?.profile?.phone }} // 使用可选链
// 或
{{ $ifEmpty($json.user.profile.phone, '无') }}// ❌ 错误
{{ $json }} // 如果需要转字符串,会出问题
// ✅ 正确
{{ JSON.stringify($json) }} // 显式转换// ❌ 错误
{{ $json.status == success }} // success 被当作变量
// ✅ 正确
{{ $json.status == 'success' }} // 字符串需要引号这是一个数据清洗和去重工作流,适合:
{
"name": "Data Cleaning with Expressions",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"url": "https://webhook.site/your-webhook-id",
"options": {}
},
"id": "abc123",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"mode": "raw",
"jsonOutput": "{\n \"userId\": \"{{ $json.user_id }}\",\n \"userName\": \"{{ $json.first_name + ' ' + $json.last_name }}\",\n \"email\": \"{{ $json.email.toLowerCase().trim() }}\",\n \"joinDate\": \"{{ $now.toISO() }}\",\n \"isActive\": \"{{ $json.status === 'active' ? true : false }}\",\n \"country\": \"{{ $json.country.toUpperCase() }}\"\n}"
},
"id": "def456",
"name": "Transform Data",
"type": "n8n-nodes-base.set",
"typeVersion": 1,
"position": [450, 300]
},
{
"parameters": {
"fields": {
"assignment": [
{
"name": "finalData",
"value": "={{ Object.assign({}, $json, { processedAt: $now.toISO() }) }}"
}
]
},
"options": {}
},
"id": "ghi789",
"name": "Add Timestamp",
"type": "n8n-nodes-base.editFields",
"typeVersion": 1,
"position": [650, 300]
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Transform Data",
"type": "main",
"index": 0
}
]
]
},
"Transform Data": {
"main": [
[
{
"node": "Add Timestamp",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {}
}发送以下 JSON 数据到 Webhook URL(使用 Postman 或 curl):
curl -X POST https://your-webhook-url \
-H "Content-Type: application/json" \
-d '{
"user_id": "12345",
"first_name": "John",
"last_name": "Doe",
"email": " JOHN@EXAMPLE.COM ",
"status": "active",
"country": "usa"
}'{
"userId": "12345",
"userName": "John Doe",
"email": "john@example.com",
"joinDate": "2025-12-05T10:51:00.000Z",
"isActive": true,
"country": "USA",
"finalData": {
"userId": "12345",
"userName": "John Doe",
"email": "john@example.com",
"joinDate": "2025-12-05T10:51:00.000Z",
"isActive": true,
"country": "USA",
"processedAt": "2025-12-05T10:51:00.000Z"
}
}$ifEmpty() 防止空值错误表达式是 n8n 的核心功能之一,掌握它能让你:
[1] 官方文档: https://docs.n8n.io/code/expressions/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#