【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"
: "zhangsan@example.com",
      "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) }}
// 输入:zhangsan@example.com → 输出: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"
: "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"
}

八、常见错误和解决方案

❌ 错误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 中选择 WorkflowsImport
  2. 2. 将上面的 JSON 代码复制粘贴到文本框
  3. 3. 点击 Import 按钮
  4. 4. 配置 Webhook URL(获取自动生成的 URL)
  5. 5. 点击 TestActivate 运行工作流

测试数据

发送以下 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"
  }

}

十、最佳实践和性能建议

📌 最佳实践

  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#