Skip to content

表达式#

表达式是 n8n 所有节点中实现的一项强大功能。它允许根据以下来源的数据动态设置节点参数:

  • 先前节点的执行结果
  • 工作流本身
  • 您的 n8n 环境

您还可以在表达式中执行 JavaScript 代码,这使得无需编写大量额外代码就能将数据转换为有用的参数值变得简单方便。

n8n 创建并使用了一种名为 Tournament 的模板语言,并通过自定义方法和变量以及数据转换函数对其进行了扩展。这些功能使得执行常见任务(如从其他节点获取数据或访问工作流元数据)变得更加容易。

n8n 还支持两个库:

  • Luxon,用于处理日期和时间
  • JMESPath,用于查询 JSON 数据

n8n 中的数据

在编写表达式时,了解 n8n 中的数据结构和行为会很有帮助。有关在工作流中处理数据的更多信息,请参阅数据

编写表达式#

要使用表达式设置参数值:

  1. 将鼠标悬停在要使用表达式的参数上
  2. 固定值/表达式切换中选择表达式
  3. 在参数中输入您的表达式,或选择打开表达式编辑器 打开表达式编辑器图标 打开表达式编辑器。如果使用表达式编辑器,您可以在变量选择器中浏览可用数据。所有表达式的格式均为 {{ 您的表达式 }}

示例:从 webhook 请求体中获取数据#

考虑以下场景:您有一个 webhook 触发器,通过请求体接收数据。您希望提取部分数据用于工作流。

您的 webhook 数据类似如下结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[
  {
    "headers": {
      "host": "n8n.instance.address",
      ...
    },
    "params": {},
    "query": {},
    "body": {
      "name": "Jim",
      "age": 30,
      "city": "New York"
    }
  }
]

在工作流的下一个节点中,您只想获取 city 的值。可以使用以下表达式:

1
{{$json.body.city}}

这个表达式:

  1. 使用 n8n 的自定义变量 $json 访问传入的 JSON 格式数据
  2. 获取 city 的值(在本例中为 "New York")。注意此示例使用 JMESPath 语法查询 JSON 数据。您也可以将此表达式写作 {{$json['body']['city']}}

示例:编写更长的 JavaScript 代码#

表达式只能包含一行 JavaScript 代码。这意味着您不能进行变量赋值或执行多个独立操作。

要理解表达式中的 JavaScript 限制并寻找解决方案,请看以下两段代码。两个示例都使用 Luxon 日期时间库来计算两个日期之间相差的月数,并将代码包裹在花括号中作为表达式。

然而,第一个示例不是有效的 n8n 表达式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 此示例分多行显示以提高可读性
// 即使写成单行也仍然无效
{{
  function example() {
    let end = DateTime.fromISO('2017-03-13');
    let start = DateTime.fromISO('2017-02-13');
    let diffInMonths = end.diff(start, 'months');
    return diffInMonths.toObject();
  }
  example();
}}

而第二个示例是有效的:

1
{{DateTime.fromISO('2017-03-13').diff(DateTime.fromISO('2017-02-13'), 'months').toObject()}}

常见问题#

关于表达式常见错误或问题及其解决方案,请参阅常见问题