【n8n教程】:掌握表达式 Expressions,让你的工作流数据处理能力翻倍!

n8n 的表达式(Expressions)是一个强大的功能,让你能够动态设置节点参数、转换数据、执行条件判断。简单来说,表达式让你用最少的代码完成复杂的数据处理,避免创建多余的节点。

一、什么是表达式?为什么要用它?

1.1 表达式的本质

表达式 是用 {{ ... }} 包裹的动态代码,可以在 n8n 的几乎所有节点参数中使用。它允许你:

1.2 不用表达式 vs 用表达式

场景:你需要从 API 获取用户数据,然后提取其中的 email 字段。

❌ 不用表达式的做法:

✅ 用表达式的做法:


二、快速开始:如何使用表达式

2.1 启用表达式模式

在 n8n 中使用表达式只需三步:

  1. 1. 找到你想设置的参数(例如,Set 节点的字段值)
  2. 2. 鼠标悬停在参数上,你会看到一个 Fixed / Expression 的切换
  3. 3. 点击 Expression,就可以开始写表达式了

💡 技巧:点击参数旁的 fx 按钮快速打开表达式编辑器

2.2 表达式编辑器

当你点击 "Open expression editor" 时,会进入一个强大的编辑器,具有:


三、核心变量:数据从哪里来?

3.1 最常用的变量

变量说明示例
$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 }}

3.2 实际例子:从 Webhook 数据中提取信息

假设你的 Webhook 收到这样的数据:


    
    
    
  {
  "body"
: {
    "user"
: {
      "name"
: "张三",
      "email"
: "[email protected]",
      "city"
: "北京"
    }

  }

}

你想提取 城市名称,可以这样写:


    
    
    
  // 方法1:使用点符号
{{ $json.body.user.city }}

// 方法2:使用中括号

{{ $json['body']['user']['city'] }}

// 两种方法都返回:北京

四、常见操作速查表

4.1 字符串操作


    
    
    
  // 转换为大写
{{ $json.name.toUpperCase() }}
// 输入:john → 输出:JOHN


// 转换为小写

{{ $json.text.toLowerCase() }}

// 截取字符串

{{ $json.email.substring(0, 5) }}
// 输入:[email protected] → 输出:zhang


// 替换文本

{{ $json.title.replace('旧词', '新词') }}

// 分割字符串

{{ $json.tags.split(',') }}
// 输入:"标签1,标签2,标签3" → 输出:["标签1", "标签2", "标签3"]


// 去除空格

{{ $json.input.trim() }}

4.2 数字运算


    
    
    
  // 基础运算
{{ $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) }}         // 取最小值

4.3 条件判断


    
    
    
  // 三元运算符(最常用)
{{ $json.age >= 18 ? '成年' : '未成年' }}

// 多层条件

{{ $json.score >= 90 ? '优秀' : $json.score >= 60 ? '及格' : '不及格' }}

// 检查值是否存在

{{ $json.status == 'active' ? '激活' : '未激活' }}

4.4 日期和时间


    
    
    
  // 获取当前时间
{{ $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日

4.5 正则表达式


    
    
    
  // 提取电子邮件地址
{{ $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"

五、高级技巧:n8n 内置函数

5.1 JMESPath 数据查询

当数据结构复杂时,用 $jmespath() 提取数据更优雅:


    
    
    
  // 提取嵌套数据
{{ $jmespath('user.profile.email', $json) }}

// 筛选数组中的特定项

{{ $jmespath('users[?age > `18`].name', $json) }}
// 返回所有年龄大于18的用户名


// 排序

{{ $jmespath('sort_by(users, &age)', $json) }}

5.2 条件函数


    
    
    
  // 设置默认值
{{ $ifEmpty($json.description, '没有描述') }}
// 如果 description 为空,则返回 '没有描述'


// 条件判断

{{ $if($json.status == 'success', 'OK', 'Error') }}
// 根据条件返回不同的值

5.3 数组操作


    
    
    
  // 获取数组长度
{{ $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) }}

六、跨节点数据访问

6.1 访问前一个节点的数据

有时你需要访问不是直接前一个的节点的数据:


    
    
    
  // 语法:$('节点名称').item.json.字段
{{ $('HTTP Request').item.json.userId }}

// 访问节点的所有输出项

{{ $('Get Users').all() }}

// 获取第一个输出项

{{ $('API Call').first().json.id }}

6.2 实际场景:合并多个节点的数据

假设有两个节点:

在 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 接收表单数据,需要:

  1. 1. 清洗和格式化数据
  2. 2. 创建新字段
  3. 3. 添加时间戳
  4. 4. 只保留必要字段

原始数据


    
    
    
  {
  "form_id"
: "123",
  "first_name"
: "John",
  "last_name"
: "Doe",
  "email_address"
: "[email protected]",
  "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"
: "[email protected]",
  "age"
: 25,
  "isSubscribed"
: true,
  "processedAt"
: "2025-12-05T10:51:00.000Z",
  "country"
: "USA"
}

八、常见错误和解决方案

❌ 错误1:忘记 $json 前缀


    
    
    
  // ❌ 错误
{{ name }}

// ✅ 正确

{{ $json.name }}

❌ 错误2:访问不存在的字段导致错误


    
    
    
  // ❌ 可能报错
{{ $json.user.profile.phone }}  // 如果中间某个字段不存在

// ✅ 安全做法

{{ $json.user?.profile?.phone }}  // 使用可选链
// 或

{{ $ifEmpty($json.user.profile.phone, '无') }}

❌ 错误3:混淆了 JSON 数据和字符串


    
    
    
  // ❌ 错误
{{ $json }}  // 如果需要转字符串,会出问题

// ✅ 正确

{{ JSON.stringify($json) }}  // 显式转换

❌ 错误4:在表达式中忘记引号


    
    
    
  // ❌ 错误
{{ $json.status == success }}  // success 被当作变量

// ✅ 正确

{{ $json.status == 'success' }}  // 字符串需要引号

九、完整可执行工作流案例

工作流说明

这是一个数据清洗和去重工作流,适合:

工作流 JSON(直接导入 n8n)


    
    
    
  {
  "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"
: {}
}

如何使用这个工作流

  1. 1. 在 n8n 中选择 Workflows → Import
  2. 2. 将上面的 JSON 代码复制粘贴到文本框
  3. 3. 点击 Import 按钮
  4. 4. 配置 Webhook URL(获取自动生成的 URL)
  5. 5. 点击 Test 或 Activate 运行工作流

测试数据

发送以下 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": "  [email protected]  ",
    "status": "active",
    "country": "usa"
  }'

预期输出


    
    
    
  {
  "userId"
: "12345",
  "userName"
: "John Doe",
  "email"
: "[email protected]",
  "joinDate"
: "2025-12-05T10:51:00.000Z",
  "isActive"
: true,
  "country"
: "USA",
  "finalData"
: {
    "userId"
: "12345",
    "userName"
: "John Doe",
    "email"
: "[email protected]",
    "joinDate"
: "2025-12-05T10:51:00.000Z",
    "isActive"
: true,
    "country"
: "USA",
    "processedAt"
: "2025-12-05T10:51:00.000Z"
  }

}

十、最佳实践和性能建议

📌 最佳实践

  1. 1. 保持表达式简洁:复杂逻辑用 Code 节点,简单转换用表达式
  2. 2. 使用有意义的变量名:便于调试和维护
  3. 3. 始终验证数据:使用 $ifEmpty() 防止空值错误
  4. 4. 充分利用编辑器:使用变量选择器,避免手打错误
  5. 5. 添加注释:在复杂表达式前添加说明

⚡ 性能建议


总结

表达式是 n8n 的核心功能之一,掌握它能让你:


官方文档[1]
n8n系列教程[2]

引用链接

[1] 官方文档: https://docs.n8n.io/code/expressions/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#