使用表达式进行数据转换#
你可以在 n8n 中支持表达式的任何位置使用表达式转换函数。
但是,如果你的主要目标是仅通过表达式进行数据转换而不执行其他操作,请使用 Edit Fields (Set) 节点。该节点专为数据转换设计,提供简洁的界面来:
- 使用基于表达式的值添加新字段
- 使用转换函数修改现有字段值
- 删除或重命名字段
这样可以将数据转换与业务逻辑分开,使工作流更有条理,更易于理解和维护。
最佳实践:与其在不同节点的多个参数中添加复杂表达式,不如先使用 Edit Fields 准备数据,然后将转换后的数据传递给后续节点。
更多信息和示例请参阅表达式参考。
示例:从 webhook body 获取数据#
考虑以下场景:你有一个 webhook 触发器,通过 webhook body 接收数据。你想从中提取部分数据在工作流中使用。
你的 webhook 数据类似于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
在工作流的下一个节点中,你想只获取 city 的值。你可以使用以下表达式:
1 | |
该表达式:
- 使用 n8n 的自定义
$json变量访问传入的 JSON 格式数据。 - 查找
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 | |
常见问题#
以下是一些与表达式相关的常见错误和问题,以及解决或排查步骤。
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 | |
例如,以下 JSON 引用了输入数据的参数。如果在没有连接其他节点的情况下测试此步骤,将会显示此错误:
1 2 3 | |
Invalid syntax#
当你使用的表达式存在语法错误时,会出现此错误。
例如,以下 JSON 中的表达式包含一个多余的句点,这会导致语法无效错误:
1 2 3 4 | |
要解决此错误,请检查你的表达式语法,确保其符合预期的格式。
