在使用n8n进行自动化工作流开发时,虽然这是一个低代码平台,但在处理节点间数据传递、数据转换等复杂场景时,仍然需要编写一些代码片段。虽然可以依赖ChatGPT等AI工具生成这些代码,但熟练掌握n8n内置的变量和方法能显著提高开发效率。本文将全面介绍n8n的内置变量与方法体系,帮助您快速掌握这些实用工具。
📌 重要提示:
本教程所有内容需要在表达式模式下使用,并包裹在
{{ }}
中部分示例由Google Gemini 1.5 Pro生成,可能存在细微误差
遇到问题时建议参考官方文档获取准确信息
一、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 实用工具方法
条件处理三剑客:
-
智能空值处理
// 多层安全访问 {{ $ifEmpty($json?.user?.profile?.bio, "暂无简介") }}
-
三元条件表达式
// 复杂条件判断 {{ $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)
: 将字符串分割成数组。
类型转换矩阵:
原始类型 | 目标类型 | 方法 | 示例 |
---|---|---|---|
String | Number | toNumber() | "123".toNumber() |
JSON | String | JSON.stringify() | stringify({id:1}) |
Date | String | format() | $now.format("yyyy-MM") |
实战案例:
// 数据清洗管道
const cleanData = {
id: $json.userId.toString(),
amount: $ifEmpty($json.amount, 0).toNumber(),
date: new Date($json.timestamp).toISOString()
};
三、高效开发实践
3.1 调试技巧
-
快速检查数据形状
// 输出完整数据结构 return [{json: {debug: $input.item}}];
-
类型检查工具
typeof $json.value // "string"|"number"|"object" Array.isArray($input.all())
3.2 性能优化
-
缓存重复查询
// 避免重复计算 const users = $("Get Users").all(); return [ {json: {count: users.length}}, {json: {first: users[0]}} ];
-
批量处理模式
// 替代循环处理 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%以上。建议:
如果您在实践中遇到任何问题,欢迎在评论区留言讨论,我将及时解答您的疑问。
更多内容可查看本专栏文章,有用的话记得点赞收藏噜!