Skip to content

使用表达式进行数据转换#

你可以在 n8n 中支持表达式的任何位置使用表达式转换函数。

但是,如果你的主要目标是仅通过表达式进行数据转换而不执行其他操作,请使用 Edit Fields (Set) 节点。该节点专为数据转换设计,提供简洁的界面来:

  • 使用基于表达式的值添加新字段
  • 使用转换函数修改现有字段值
  • 删除或重命名字段

这样可以将数据转换与业务逻辑分开,使工作流更有条理,更易于理解和维护。

最佳实践:与其在不同节点的多个参数中添加复杂表达式,不如先使用 Edit Fields 准备数据,然后将转换后的数据传递给后续节点。

在 UI 中创建表达式

更多信息和示例请参阅表达式参考

示例:从 webhook body 获取数据#

考虑以下场景:你有一个 webhook 触发器,通过 webhook body 接收数据。你想从中提取部分数据在工作流中使用。

你的 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']}}

在凭据中使用表达式#

你还可以在凭据字段中使用表达式。当你通过表达式引用数据时(例如 {{$json.body.city}}{{ $('Webhook').item.json.headers.authorization }}),n8n 会在当前工作流执行的上下文中计算表达式。

这意味着:

  • 凭据中的表达式可以访问当前执行上下文中的可用数据,包括前面节点的数据。
  • 每次工作流执行都有自己的数据上下文。
  • 表达式按每次执行进行计算,因此不同的执行之间不会共享数据。

例如,如果一个 webhook 节点接收了一个访问令牌,而你在凭据字段中使用表达式引用了它,那么该值将使用该特定工作流运行的执行数据来解析。

示例:编写较长的 JavaScript 表达式#

你可以在表达式中执行变量赋值或多条语句等操作,但需要使用立即调用函数表达式(IIFE)语法包装代码。

以下代码使用 Luxon 日期时间库来计算两个日期之间的月份差。我们将代码同时包裹在表达式的大括号和 IIFE 语法中。

1
2
3
4
5
6
{{(()=>{
  let end = DateTime.fromISO('2017-03-13');
  let start = DateTime.fromISO('2017-02-13');
  let diffInMonths = end.diff(start, 'months');
  return diffInMonths.toObject();
})()}}

常见问题#

以下是一些与表达式相关的常见错误和问题,以及解决或排查步骤。

The 'JSON Output' in item 0 contains invalid JSON#

当你使用 JSON 模式但未提供有效的 JSON 对象时,会出现此错误。根据 JSON 对象的问题不同,该错误有时显示为 The 'JSON Output' in item 0 does not contain a valid JSON object

要解决此问题,请确保你提供的代码是有效的 JSON:

  • 使用 JSON 验证器检查 JSON。
  • 检查你的 JSON 对象是否引用了未定义的输入数据。如果传入数据并非始终包含相同的字段,可能会出现此情况。

Can't get data for expression#

当 n8n 无法检索表达式引用的数据时,会出现此错误。这通常发生在前面的节点尚未运行时。

此错误的另一种形式可能显示为 Referenced node is unexecuted。在这种情况下,错误的完整文本会以以下格式告诉你具体哪个节点未执行:

An expression references the node '<node-name>', but it hasn't been executed yet. Either change the expression, or re-wire your workflow to make sure that node executes first.

要开始排查,请测试工作流直到指定的节点。

对于使用 JavaScript 或其他自定义代码的节点,你可以在尝试使用其值之前,通过以下方式检查前面的节点是否已执行:

1
$("<node-name>").isExecuted

例如,以下 JSON 引用了输入数据的参数。如果在没有连接其他节点的情况下测试此步骤,将会显示此错误:

1
2
3
{
  "my_field_1": {{ $input.params }}
}

Invalid syntax#

当你使用的表达式存在语法错误时,会出现此错误。

例如,以下 JSON 中的表达式包含一个多余的句点,这会导致语法无效错误:

1
2
3
4
{
  "my_field_1": "value",
  "my_field_2": {{ $('If').item.json. }}
}

要解决此错误,请检查你的表达式语法,确保其符合预期的格式。