📤n8n内建变量与方法
在使用 n8n 的过程中,我们会发现 n8n 虽然是一个低代码平台,但在节点间数据传递,数据转换,数据处理的时候,难免还是需要一些微小的代码碎片。
如果你与 ChatGPT 结对编程,当然可以把这些代码碎片交给 AI 去生成,但对于一些快捷变量和方法,还是自己记住会更快一些。
本文,就是对 n8n 内置变量与方法的介绍与教程。
本篇教程通过将 n8n 官方文档的相关部分投喂 Google Gemini 1.5 Pro 后生成,部分示例可能存在错误。
💡
提示: 本教程中的所有变量、方法、数据转化快捷方式,在 n8n 中生效的前提,是将文本框修改为 Expression 模式,并且包裹在 中哦:

如果你在按照本文进行操作时遇到了问题,可以访问官方原始文档查阅准确信息:
一、内建变量
概述
n8n 提供了丰富的内建变量,让你能够轻松访问工作流的执行环境、节点数据、以及 n8n 平台自身的信息。这些变量就像预设的快捷方式,让你无需编写复杂的代码即可获取所需信息,从而简化工作流的构建过程。
主要功能:
访问节点的输入和输出数据。
获取工作流的执行状态和参数。
读取环境变量和用户自定义变量。
获取当前时间和日期。
在 HTTP 节点中使用分页变量。
在 LangChain 代码节点中使用特定变量。
各类型变量详解
当前节点输入 (Current node input)
这些变量用于访问当前节点的输入数据,例如:
**$input.item**: 表示当前正在处理的输入项,包含了该项的所有数据。**$input.all()**: 返回一个包含所有输入项的数组。**$input.first()**: 返回第一个输入项。**$input.last()**: 返回最后一个输入项。**$input.params**: 包含前一个节点的查询设置,例如操作类型、结果限制等。**$json**:$input.item.json的简写形式,用于访问输入项的 JSON 数据。**$binary**:$input.item.binary的简写形式,用于访问输入项的二进制数据。**$input.context.noItemsLeft**: 布尔值,仅在使用 “循环项” 节点时可用,用于判断是否还有剩余项需要处理。
使用示例:
// 获取输入项的 "name" 字段值,必须使用json
$input.item.json.name
$input.first().json.name
// 获取所有输入项的 ID
{{ $input.all().map(item => item.json.id) }}
for (const item of $input.all()) {
item.json.myNewField = 1;
}其他节点输出 (Output of other nodes)
使用 $("<node-name>") 相关方法可以访问其他节点的输出数据,例如:
**$("<node-name>").all(branchIndex?, runIndex?)**: 返回指定节点的所有输出项。**$("<node-name>").first(branchIndex?, runIndex?)**: 返回指定节点的第一个输出项。**$("<node-name>").last(branchIndex?, runIndex?)**: 返回指定节点的最后一个输出项。**$("<node-name>").item**: 返回与当前项链接的指定节点的输出项。**$("<node-name>").params**: 包含指定节点的查询设置。**$("<node-name>").context**: 布尔值,仅在使用 “循环项” 节点时可用。**$("<node-name>").itemMatching(currentNodeInputIndex)**: 在代码节点中用于代替$("<node-name>").item,用于追溯输入项的来源。
使用示例:
// 获取名为 "HTTP Request" 节点的第一个输出项的 "title" 字段值
{{ $("HTTP Request").first().json.title }}
// 获取与当前项链接的 "Create User" 节点的输出项的 "id" 字段值
{{ $("Create User").item.json.id }}n8n 元数据 (n8n metadata)
这些变量用于访问 n8n 平台自身的信息,例如:
**$env**: 包含 n8n 实例的配置环境变量。**$execution.customData**: 用于设置和获取自定义执行数据。**$execution.id**: 当前工作流执行的唯一 ID。**$execution.mode**: 执行模式,例如test或production。**$execution.resumeUrl**: 用于恢复等待节点的 webhook URL。**$getWorkflowStaticData(type)**: 获取工作流的静态数据。**$("<node-name>").isExecuted**: 检查指定节点是否已执行。**$itemIndex**: 当前项在列表中的索引。**$nodeVersion**: 当前节点的版本号。**$prevNode.name**: 前一个节点的名称。**$prevNode.outputIndex**: 前一个节点的输出连接器的索引。**$prevNode.runIndex**: 前一个节点的运行索引。**$runIndex**: 当前节点的运行次数。**$secrets**: 包含外部密钥的信息。**$vars**: 包含当前环境中可用的变量。**$version**: n8n 节点的版本号。**$workflow.active**: 工作流是否处于活动状态。**$workflow.id**: 工作流的 ID。**$workflow.name**: 工作流的名称。
使用示例:
// 获取环境变量 "API_KEY" 的值
{{ $env["API_KEY"] }}
// 获取当前工作流的 ID
{{ $workflow.id }}JavaScript
日期和时间 (Date and time)
**$now**: 表示当前时间的 Luxon 对象。**$today**: 表示今天日期的 Luxon 对象 (不包含时间)。
使用示例:
// 获取当前时间的 ISO 格式字符串
{{ $now.toISO() }}
// 获取今天的日期字符串 (YYYY-MM-DD 格式)
{{ $today.toFormat("YYYY-MM-DD") }}HTTP 节点变量 (HTTP node variables)
这些变量仅在 HTTP 节点中可用,用于处理分页请求,例如:
**$http.pagination.page**: 当前页码。**$http.pagination.perPage**: 每页的项目数。**$http.pagination.total**: 总项目数。**$http.pagination.totalPages**: 总页数。
使用示例:
// 获取下一页的 URL
{{ $input.item.json.next_page_url }}
// 获取当前页码
{{ $http.pagination.page }}LangChain 代码节点方法 (LangChain Code node methods)
这些变量仅在 LangChain 代码节点中可用,例如:
**$llmInput**: LLM 模型的输入数据。**$generateText**: 用于生成文本的函数。**$memory**: 用于管理对话记忆的变量。
使用示例:
// 将用户输入添加到 LLM 模型的输入中
{{ $llmInput += $input.item.json.user_input }}
// 使用 LLM 模型生成文本
{{ $generateText($llmInput) }}JavaScript
使用示例
以下是一些使用内建变量的示例:
1. 获取当前节点的输入数据:
// 获取输入项的 "email" 字段值
{{ $input.item.json.email }}JavaScript
2. 获取前一个节点的输出数据:
// 获取名为 "Webhook" 节点的第一个输出项的 "message" 字段值
{{ $("Webhook").first().json.message }}JavaScript
3. 获取当前工作流的名称:
// 获取当前工作流的名称
{{ $workflow.name }}JavaScript
4. 获取当前时间:
// 获取当前时间的 ISO 格式字符串
{{ $now.toISO() }}JavaScript
二、内建方法
概述
方法是一个基础的编程概念,你可以简单将其理解为一些已经预制的、不需要自己手动编排的任务。
除了丰富的内建变量,n8n 还提供了一些实用的内建方法,用于执行特定的操作,例如对 JSON 数据进行查询、表达式求值、条件判断等。这些方法可以帮助你更高效地处理数据,简化工作流的逻辑,并提升整体的可读性和可维护性。
各类型方法详解
JMESPath 方法 (JMESPath method): $jmespath()
$jmespath() 方法允许你使用 JMESPath 查询语言对 JSON 数据进行搜索和过滤。JMESPath 是一种强大的查询语言,可以让你轻松地从复杂的 JSON 数据中提取所需的信息。
语法:
$jmespath(expression, data)JavaScript
expression: JMESPath 查询表达式,用于指定要提取的数据。data: 要查询的 JSON 数据。
功能:
从 JSON 数据中提取指定字段的值。
根据条件筛选 JSON 数据。
对 JSON 数据进行排序和分组。
执行各种数据转换操作。
使用示例:
假设你有一个包含用户信息的 JSON 数据:
{
"users": [
{
"id": 1,
"name": "John Doe",
"email": "john.doe@example.com"
},
{
"id": 2,
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
]
}JSON
你可以使用 $jmespath() 方法提取所有用户的邮箱地址:
{{ $jmespath("users[*].email", $input.item.json) }}JavaScript
这将返回一个包含所有邮箱地址的数组:
[
"john.doe@example.com",
"jane.doe@example.com"
]Plain text
你还可以使用 $jmespath() 方法筛选出 ID 大于 1 的用户:
{{ $jmespath("users[?id > `1`]", $input.item.json) }}JavaScript
这将返回一个包含符合条件的用户的数组:
[
{
"id": 2,
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
]Plain text
便利方法 (Convenience methods)
n8n 提供了一些便捷方法,用于简化常见的操作,例如:
**$evaluateExpression(expression, itemIndex?)**: 将字符串作为表达式进行求值。expression: 要执行的表达式字符串。itemIndex: 可选参数,指定要使用的输入项的索引。默认为 0。使用示例:
- javascript
// 计算两个数字的和 {{ $evaluateExpression("1 + 2") }} // 返回 3 // 使用输入项的字段值进行计算 {{ $evaluateExpression("$input.item.json.price * $input.item.json.quantity") }}JavaScript
**$ifEmpty(value, defaultValue)**: 如果value为空,则返回defaultValue,否则返回value。value: 要检查的值。defaultValue: 如果value为空则返回的默认值。使用示例:
- javascript
// 如果 "description" 字段为空,则返回 "No description" {{ $ifEmpty($input.item.json.description, "No description") }}JavaScript
**$if(condition, valueIfTrue, valueIfFalse)**: 根据条件返回不同的值。condition: 要评估的条件。valueIfTrue: 如果条件为真则返回的值。valueIfFalse: 如果条件为假则返回的值。使用示例:
- javascript
// 如果 "status" 字段等于 "success",则返回 "OK",否则返回 "Error" {{ $if($input.item.json.status == "success", "OK", "Error") }}JavaScript
**$max(number1, number2, ...)**: 返回多个数字中的最大值。number1, number2, ...: 要比较的数字。使用示例:
- javascript
// 返回 3 和 5 中的最大值 {{ $max(3, 5) }} // 返回 5JavaScript
**$min(number1, number2, ...)**: 返回多个数字中的最小值。number1, number2, ...: 要比较的数字。使用示例:
- javascript
// 返回 3 和 5 中的最小值 {{ $min(3, 5) }} // 返回 3JavaScript
使用示例
以下是一些在表达式和代码节点中使用内建方法的示例:
表达式示例:
// 使用 JMESPath 提取数据
{{ $jmespath("data.items[0].name", $input.item.json) }}
// 使用 $ifEmpty 设置默认值
{{ $ifEmpty($input.item.json.description, "No description provided") }}JavaScript
代码节点 (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 } }];JavaScript
三、数据转换函数
概述
在编程的过程中,变量有不同的类型。比如同样用肉眼看起来的 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): 将字符串分割成数组。
使用示例
以下是一些使用数据转换函数的示例:
1. 将字符串转换为数字:
{{ "123".toNumber() }} // 返回数字 123JavaScript
2. 将日期格式化为 YYYY-MM-DD 格式:
{{ $now.format("YYYY-MM-DD") }} // 返回当前日期,例如 2023-10-27JavaScript
3. 获取数组的第一个元素:
{{ ["apple", "banana", "orange"].first() }} // 返回 "apple"JavaScript
4. 检查字符串是否包含指定的子字符串:
{{ "hello world".contains("world") }} // 返回 trueJavaScript
5. 将对象转换为 JSON 字符串:
{{ JSON.stringify({ name: "John", age: 30 }) }} // 返回 '{"name":"John","age":30}'JavaScript
四、附录:常用变量和方法速查表
为了方便你快速查找和用 n8n 内建变量与方法,我们在这里提供一个常用变量和方法的速查表。
常用变量:
| 变量 | 描述 | 示例 |
|---|---|---|
$input.item | 当前处理的输入项 | $input.item.json.name |
$input.all() | 所有输入项 | $input.all().map(item => item.json.id) |
$input.first() | 第一个输入项 | $input.first().json.title |
$input.last() | 最后一个输入项 | $input.last().json.description |
$json | 输入项的 JSON 数据 | $json.email |
$binary | 输入项的二进制数据 | $binary.data |
$("<node-name>").first() | 指定节点的第一个输出项 | $("HTTP Request").first().json.data |
$("<node-name>").item | 与当前项链接的指定节点的输出项 | $("Create Record").item.json.id |
$env | 环境变量 | $env["API_KEY"] |
$execution.id | 当前执行 ID | $execution.id |
$workflow.name | 当前工作流名称 | $workflow.name |
$now | 当前时间 (Luxon 对象) | $now.toISO() |
$today | 今天日期 (Luxon 对象) | $today.toFormat("YYYY-MM-DD") |
常用方法:
| 方法 | 描述 | 示例 |
|---|---|---|
$jmespath(expression, data) | 使用 JMESPath 查询 JSON 数据 | $jmespath("users[*].email", $input.item.json) |
$evaluateExpression(expression) | 将字符串作为表达式求值 | $evaluateExpression("$input.item.json.price * 2") |
$ifEmpty(value, defaultValue) | 如果值为空则返回默认值 | $ifEmpty($input.item.json.description, "No description") |
$if(condition, valueIfTrue, valueIfFalse) | 根据条件返回不同值 | $if($input.item.json.status == "success", "OK", "Error") |
$max(number1, number2, ...) | 返回多个数字中的最大值 | $max(3, 5, 1) |
$min(number1, number2, ...) | 返回多个数字中的最小值 | $min(3, 5, 1) |
array.contains(value) | 检查数组是否包含指定值 | ["apple", "banana"].contains("apple") |
string.length() | 获取字符串长度 | "hello".length() |
date.format(format) | 将日期格式化为指定字符串 | $now.format("YYYY-MM-DD") |
注意:
这只是一份常用变量和方法的速查表,n8n 提供了更多的变量和方法,你可以参考官方文档了解更多信息。
表格中的示例仅供参考,你需要根据实际情况修改变量和表达式的值。
希望这份速查表能够帮助你更方便地使用 n8n 内建变量与方法,从而更高效地构建和维护你的工作流。