n8n 中文系列教程_11. 深入掌握n8n:内置变量与方法完全指南

        在使用n8n进行自动化工作流开发时,虽然这是一个低代码平台,但在处理节点间数据传递、数据转换等复杂场景时,仍然需要编写一些代码片段。虽然可以依赖ChatGPT等AI工具生成这些代码,但熟练掌握n8n内置的变量和方法能显著提高开发效率。本文将全面介绍n8n的内置变量与方法体系,帮助您快速掌握这些实用工具。

📌 重要提示:

  1. 本教程所有内容需要在表达式模式下使用,并包裹在{{ }}

  2. 部分示例由Google Gemini 1.5 Pro生成,可能存在细微误差

  3. 遇到问题时建议参考官方文档获取准确信息

一、n8n内置变量详解

1.1 变量概述

n8n提供了丰富的内置变量体系,开发者可以直接访问工作流执行环境、节点数据和平台信息。这些预置变量相当于快捷方式,能大幅简化工作流构建过程。

核心优势:

  • 无需复杂代码即可获取关键信息

  • 标准化访问方式提高开发效率

  • 增强工作流的可读性和可维护性

1.2 变量分类与使用

1.2.1 当前节点输入变量
变量描述示例
$input.item当前处理项的全量数据{{ $input.item.json.name }}
$input.all()所有输入项的数组{{ $input.all().map(i => i.json.id) }}
$input.first()第一个输入项{{ $input.first().json.title }}
$input.last()最后一个输入项{{ $input.last().json.value }}
$input.params前节点的查询参数{{ $input.params.limit }}
$json$input.item.json的简写{{ $json.email }}
$binary二进制数据简写{{ $binary.data }}

实战技巧:

// 获取当前项及关联数据
const currentItem = $input.item.json;
const relatedId = $("Previous Node").item.json.id;

// 批量处理所有输入项
const allIds = $input.all().map(item => ({
  id: item.json.id,
  processedAt: $now.toISO()
}));
1.2.2 其他节点输出变量
方法描述示例
$("Node").all()获取节点所有输出{{ $("HTTP").all() }}
$("Node").first()获取首个输出项{{ $("API").first().json }}
$("Node").item获取关联输出项{{ $("DB").item.json.id }}

典型应用场景:

// 跨节点数据关联
const userData = $("Get User").item.json;
const orderData = $("Get Orders").all()
  .filter(order => order.json.userId === userData.id);

// 条件分支处理
if ($("Check Status").first().json.valid) {
  return [{json: {action: "approve"}}];
}
 
1.2.3 n8n元数据变量
变量描述应用场景
$execution.id执行ID日志追踪
$workflow.name工作流名称动态标题生成
$nodeVersion节点版本兼容性检查
$secrets密钥管理安全认证

安全实践:

// 安全访问环境变量
const apiKey = $env["API_KEY"] || $secrets.apiKey;

// 执行上下文记录
$execution.customData.set("startTime", $now.toISO());
 
1.2.4 日期时间变量
// 获取当前时间戳
{{ $now.toMillis() }}

// 计算到期日期(3天后)
{{ $now.plus({days:3}).toFormat("yyyy-MM-dd") }}

// 工作日判断
const isWeekday = $now.weekday < 6;
 

二、内置方法深度解析

方法是一个基础的编程概念,你可以简单将其理解为一些已经预制的、不需要自己手动编排的任务。

除了丰富的内建变量,n8n 还提供了一些实用的内建方法,用于执行特定的操作,例如对 JSON 数据进行查询、表达式求值、条件判断等。这些方法可以帮助你更高效地处理数据,简化工作流的逻辑,并提升整体的可读性和可维护性。

2.1 JMESPath数据查询

语法结构:

$jmespath(expression, data)
  • expression: JMESPath 查询表达式,用于指定要提取的数据。

  • data: 要查询的 JSON 数据。

复杂示例:

// 原始数据
{
  "departments": [
    {
      "name": "Sales",
      "employees": [
        {"name": "John", "salary": 50000},
        {"name": "Jane", "salary": 60000}
      ]
    }
  ]
}
 
// 获取所有薪资>55000的员工
{{ $jmespath("departments[*].employees[?salary > `55000`]", $input.item.json) }}

// 计算平均薪资
{{ $jmespath("avg(departments[0].employees[*].salary)", $input.item.json) }}

 

2.2 实用工具方法

条件处理三剑客:
  1. 智能空值处理

    // 多层安全访问
    {{ $ifEmpty($json?.user?.profile?.bio, "暂无简介") }}
     
  2. 三元条件表达式

    // 复杂条件判断
    {{ $if($json.status === "active" && $json.value > 100, 
          "VIP", 
          "Standard") }}
     
便利方法 (Convenience methods)

n8n 提供了一些便捷方法,用于简化常见的操作,例如:

  • $evaluateExpression(expression, itemIndex?): 将字符串作为表达式进行求值。

    使用示例:

    // 计算两个数字的和
    {{ $evaluateExpression("1 + 2") }} // 返回 3
    
    // 使用输入项的字段值进行计算
    {{ $evaluateExpression("$input.item.json.price * $input.item.json.quantity") }}
    expression: 要执行的表达式字符串。
    itemIndex: 可选参数,指定要使用的输入项的索引。默认为 0。

  • $ifEmpty(value, defaultValue): 如果 value 为空,则返回 defaultValue,否则返回 value

    使用示例:

    // 如果 "description" 字段为空,则返回 "No description"
    {{ $ifEmpty($input.item.json.description, "No description") }}
    value: 要检查的值。
    defaultValue: 如果 value 为空则返回的默认值。
    • $if(condition, valueIfTrue, valueIfFalse): 根据条件返回不同的值。

      使用示例:

      // 如果 "status" 字段等于 "success",则返回 "OK",否则返回 "Error"
      {{ $if($input.item.json.status == "success", "OK", "Error") }}
      condition: 要评估的条件。
      valueIfTrue: 如果条件为真则返回的值。
      valueIfFalse: 如果条件为假则返回的值。
      • $max(number1, number2, ...): 返回多个数字中的最大值。

        使用示例:

        // 返回 3 和 5 中的最大值
        {{ $max(3, 5) }} // 返回 5
        • number1, number2, ...: 要比较的数字。
      • $min(number1, number2, ...): 返回多个数字中的最小值。

        使用示例:

        // 返回 3 和 5 中的最小值
        {{ $min(3, 5) }} // 返回 3
        • number1, number2, ...: 要比较的数字。

      使用示例

      以下是一些在表达式和代码节点中使用内建方法的示例:

      表达式示例:

      // 使用 JMESPath 提取数据
      {{ $jmespath("data.items[0].name", $input.item.json) }}
      
      // 使用 $ifEmpty 设置默认值
      {{ $ifEmpty($input.item.json.description, "No description provided") }}

      代码节点 (JavaScript) 示例:

      // 使用 $evaluateExpression 动态执行表达式
      const result = $evaluateExpression("$input.item.json.value1 + $input.item.json.value2");
      return [{ json: { result } }];
      
      // 使用 JMESPath 筛选数据
      const filteredItems = $jmespath("items[?status == 'active']", $input.item.json);
      return [{ json: { filteredItems } }];

      2.3 数据转换函数库

      在编程的过程中,变量有不同的类型。比如同样用肉眼看起来的 2024-08-01,在作为字符串类型时,就可以在它的后面加入更多文字,在作为日期类型时,就可以做时间的增减操作。

      将数据转换成指定的类型,就是数据转换函数所要做的事情,否则在做对应数据处理的时候会出现错误。

      使用场景:

      • 数据清洗: 将不规范的数据转换为符合要求的格式。
      • 数据格式化: 将数据转换为易于阅读和理解的格式。
      • 数据处理: 对数据进行筛选、排序、聚合等操作。
      • 跨平台数据交互: 将不同平台的数据转换为统一的格式。

      优势:

      • 简化代码: 无需编写复杂的代码,即可完成各种数据转换操作。
      • 提高效率: n8n 平台对这些函数进行了优化,可以快速执行操作。
      • 易于维护: 使用标准化的函数,可以提高代码的可读性和可维护性。

      各类型数据转换函数详解

      n8n 的数据转换函数根据数据类型进行分类,主要包括以下几种:

      数组 (Arrays)

      用于操作数组类型的数据,例如:

      • array.contains(value): 检查数组是否包含指定的值。
      • array.filter(callback): 根据回调函数筛选数组元素。
      • array.join(separator): 将数组元素连接成字符串。
      • array.map(callback): 对数组元素进行映射操作。
      • array.slice(start, end): 截取数组的一部分。
      • array.sort(callback): 对数组元素进行排序。
      • array.unique(): 返回数组中唯一值的数组。

      布尔值 (Booleans)

      用于操作布尔类型的数据,例如:

      • boolean.toString(): 将布尔值转换为字符串 "true" 或 "false"。

      日期 (Dates)

      用于操作日期类型的数据,例如:

      • date.addDays(days): 在日期上添加指定天数。
      • date.addHours(hours): 在日期上添加指定小时数。
      • date.addMinutes(minutes): 在日期上添加指定分钟数。
      • date.addMonths(months): 在日期上添加指定月数。
      • date.addYears(years): 在日期上添加指定年数。
      • date.format(format): 将日期格式化为指定的字符串。
      • date.getDay(): 获取日期是星期几 (0 - 6)。
      • date.getMonth(): 获取日期是几月 (0 - 11)。
      • date.getYear(): 获取日期是哪一年。

      数字 (Numbers)

      用于操作数字类型的数据,例如:

      • number.toFixed(digits): 将数字格式化为指定位数的小数。
      • number.toString(): 将数字转换为字符串。

      对象 (Objects)

      用于操作对象类型的数据,例如:

      • object.keys(): 获取对象的所有键名。
      • object.values(): 获取对象的所有键值。

      字符串 (Strings)

      用于操作字符串类型的数据,例如:

      • string.contains(substring): 检查字符串是否包含指定的子字符串。
      • string.length(): 获取字符串的长度。
      • string.toLowerCase(): 将字符串转换为小写。
      • string.toUpperCase(): 将字符串转换为大写。
      • string.trim(): 去除字符串两端的空格。
      • string.replace(search, replace): 替换字符串中的指定内容。
      • string.split(separator): 将字符串分割成数组。
      类型转换矩阵:
      原始类型目标类型方法示例
      StringNumbertoNumber()"123".toNumber()
      JSONStringJSON.stringify()stringify({id:1})
      DateStringformat()$now.format("yyyy-MM")

      实战案例:

      // 数据清洗管道
      const cleanData = {
        id: $json.userId.toString(),
        amount: $ifEmpty($json.amount, 0).toNumber(),
        date: new Date($json.timestamp).toISOString()
      };
       
      

      三、高效开发实践

      3.1 调试技巧

      1. 快速检查数据形状

        // 输出完整数据结构
        return [{json: {debug: $input.item}}];
         
      2. 类型检查工具

        typeof $json.value // "string"|"number"|"object"
        Array.isArray($input.all()) 
         

      3.2 性能优化

      1. 缓存重复查询

        // 避免重复计算
        const users = $("Get Users").all();
        return [
          {json: {count: users.length}},
          {json: {first: users[0]}}
        ];
         
      2. 批量处理模式

        // 替代循环处理
        const processed = $input.all().map(item => ({
          ...item.json,
          processedAt: $now.toISO()
        }));
         

      四、附录:速查手册

      4.1 变量速查表

      分类常用变量典型应用
      节点数据$input.item $("Node").all()数据传递
      工作流$workflow.id $execution.mode上下文感知
      日期$now $today时间计算

      4.2 方法速查表

      类别方法签名使用示例
      数据查询$jmespath()复杂JSON处理
      条件逻辑$if() $ifEmpty()分支控制
      数学计算$max() $min()数值处理

      结语

      掌握n8n的内置变量和方法体系,能够使您的低代码开发效率提升50%以上。建议:

      1. 收藏本文的速查表部分

      2. 在实际项目中尝试组合使用不同变量

      3. 定期查阅官方文档更新

      4.  ✨中转使用教程

      如果您在实践中遇到任何问题,欢迎在评论区留言讨论,我将及时解答您的疑问。


      更多内容可查看本专栏文章,有用的话记得点赞收藏噜!

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值