跳至内容

表达式#

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

  • 之前的节点执行记录
  • 工作流
  • 您的n8n环境

您还可以在表达式中执行JavaScript代码,这是一种便捷且简单的方式,无需编写大量额外代码即可将数据处理成有用的参数值。

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

n8n 还支持两个库:

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

n8n 中的数据

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

编写表达式#

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

  1. 将鼠标悬停在你想要使用表达式的参数上。
  2. 固定/表达式切换中选择表达式
  3. 在参数中编写您的表达式,或选择打开表达式编辑器 Open expressions editor icon来打开表达式编辑器。如果使用表达式编辑器,您可以在变量选择器中浏览可用数据。所有表达式都遵循{{ your expression here }}格式。

示例:从webhook正文获取数据#

考虑以下场景:您有一个通过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日期时间库来计算两个日期之间相差的月数,并将代码包裹在handlebar括号中,就像一个表达式。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// This example is split over multiple lines for readability
// It's still invalid when formatted as a single line
{{
  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()}}

常见问题#

有关表达式的常见错误或问题及建议解决步骤,请参阅常见问题

优云智算