Skip to content

📤n8n内建变量与方法

在使用 n8n 的过程中,我们会发现 n8n 虽然是一个低代码平台,但在节点间数据传递,数据转换,数据处理的时候,难免还是需要一些微小的代码碎片。

如果你与 ChatGPT 结对编程,当然可以把这些代码碎片交给 AI 去生成,但对于一些快捷变量和方法,还是自己记住会更快一些。

本文,就是对 n8n 内置变量与方法的介绍与教程。

本篇教程通过将 n8n 官方文档的相关部分投喂 Google Gemini 1.5 Pro 后生成,部分示例可能存在错误。

💡

提示: 本教程中的所有变量、方法、数据转化快捷方式,在 n8n 中生效的前提,是将文本框修改为 Expression 模式,并且包裹在 中哦:

notion image

如果你在按照本文进行操作时遇到了问题,可以访问官方原始文档查阅准确信息:

一、内建变量

概述

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**: 布尔值,仅在使用 “循环项” 节点时可用,用于判断是否还有剩余项需要处理。

使用示例:

javascript
// 获取输入项的 "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,用于追溯输入项的来源。

使用示例:

javascript
// 获取名为 "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**: 执行模式,例如 testproduction

  • **$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**: 工作流的名称。

使用示例:

javascript
// 获取环境变量 "API_KEY" 的值
{{ $env["API_KEY"] }}

// 获取当前工作流的 ID
{{ $workflow.id }}

JavaScript

日期和时间 (Date and time)

  • **$now**: 表示当前时间的 Luxon 对象。

  • **$today**: 表示今天日期的 Luxon 对象 (不包含时间)。

使用示例:

javascript
// 获取当前时间的 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**: 总页数。

使用示例:

javascript
// 获取下一页的 URL
{{ $input.item.json.next_page_url }}

// 获取当前页码
{{ $http.pagination.page }}

LangChain 代码节点方法 (LangChain Code node methods)

这些变量仅在 LangChain 代码节点中可用,例如:

  • **$llmInput**: LLM 模型的输入数据。

  • **$generateText**: 用于生成文本的函数。

  • **$memory**: 用于管理对话记忆的变量。

使用示例:

javascript
// 将用户输入添加到 LLM 模型的输入中
{{ $llmInput += $input.item.json.user_input }}

// 使用 LLM 模型生成文本
{{ $generateText($llmInput) }}

JavaScript

使用示例

以下是一些使用内建变量的示例:

1. 获取当前节点的输入数据:

javascript
// 获取输入项的 "email" 字段值
{{ $input.item.json.email }}

JavaScript

2. 获取前一个节点的输出数据:

javascript
// 获取名为 "Webhook" 节点的第一个输出项的 "message" 字段值
{{ $("Webhook").first().json.message }}

JavaScript

3. 获取当前工作流的名称:

javascript
// 获取当前工作流的名称
{{ $workflow.name }}

JavaScript

4. 获取当前时间:

javascript
// 获取当前时间的 ISO 格式字符串
{{ $now.toISO() }}

JavaScript

二、内建方法

概述

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

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

各类型方法详解

JMESPath 方法 (JMESPath method): $jmespath()

$jmespath() 方法允许你使用 JMESPath 查询语言对 JSON 数据进行搜索和过滤。JMESPath 是一种强大的查询语言,可以让你轻松地从复杂的 JSON 数据中提取所需的信息。

语法:

javascript
$jmespath(expression, data)

JavaScript

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

  • data: 要查询的 JSON 数据。

功能:

  • 从 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() 方法提取所有用户的邮箱地址:

javascript
{{ $jmespath("users[*].email", $input.item.json) }}

JavaScript

这将返回一个包含所有邮箱地址的数组:

plain
[
  "john.doe@example.com",
  "jane.doe@example.com"
]

Plain text

你还可以使用 $jmespath() 方法筛选出 ID 大于 1 的用户:

javascript
{{ $jmespath("users[?id > `1`]", $input.item.json) }}

JavaScript

这将返回一个包含符合条件的用户的数组:

plain
[
  {
    "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) }} // 返回 5

      JavaScript

  • **$min(number1, number2, ...)**: 返回多个数字中的最小值。

    • number1, number2, ...: 要比较的数字。

    • 使用示例:

    • javascript
      // 返回 3 和 5 中的最小值
      {{ $min(3, 5) }} // 返回 3

      JavaScript

使用示例

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

表达式示例:

javascript
// 使用 JMESPath 提取数据
{{ $jmespath("data.items[0].name", $input.item.json) }}

// 使用 $ifEmpty 设置默认值
{{ $ifEmpty($input.item.json.description, "No description provided") }}

JavaScript

代码节点 (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. 将字符串转换为数字:

javascript
{{ "123".toNumber() }} // 返回数字 123

JavaScript

2. 将日期格式化为 YYYY-MM-DD 格式:

javascript
{{ $now.format("YYYY-MM-DD") }} // 返回当前日期,例如 2023-10-27

JavaScript

3. 获取数组的第一个元素:

javascript
{{ ["apple", "banana", "orange"].first() }} // 返回 "apple"

JavaScript

4. 检查字符串是否包含指定的子字符串:

javascript
{{ "hello world".contains("world") }} // 返回 true

JavaScript

5. 将对象转换为 JSON 字符串:

javascript
{{ 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 内建变量与方法,从而更高效地构建和维护你的工作流。

上次更新时间:

最近更新