什么是 n8n 中的表达式
n8n 表达式让你能够动态地引用数据,而不是硬编码值。当你将节点连接在一起时,数据会以 JSON 对象的形式从一个节点流向下一个节点。表达式为你提供了一种方式,可以深入到该 JSON 中并准确提取你需要的值——或者在传递之前对其进行转换。
n8n 中的每个表达式都用双花括号包裹。在花括号内编写兼容 JavaScript 的代码,n8n 会在工作流执行时于运行时对其进行求值。
该表达式从当前节点输入数据中读取 email 字段。很简单,但这种模式是你进行所有数据映射工作的基础。
你每天都会使用的关键变量
n8n 在表达式内暴露了多个内置变量。掌握以下三个就能覆盖绝大多数真实的工作流场景。
第一个是 json.name 就会为你提供该用户的 name 字段。
第二个是 $node,它允许你访问工作流中任意命名节点。这在你需要来自非直接前驱节点的数据时非常有用。
第三个是 $now,它以 Luxon DateTime 对象的形式返回当前时间戳。你可以直接在其上调用 Luxon 方法。
n8n 内置了用于日期处理的 Luxon,同时也暴露了完整的 JavaScript 标准库,因此字符串方法、Math 和 JSON 工具函数都可以在表达式中使用。
使用表达式转换数据
表达式不仅用于读取值——你还可以对其进行内联转换。常见模式包括字符串拼接、数字格式化、条件判断和数组操作。
从两个字段组合出完整姓名:
当字段可能缺失时,使用一个简单的条件来设置回退值:
将作为 Unix 时间戳传入的日期进行格式化:
Set 节点是使用这些表达式最自然的位置。当需要重命名字段、合并值,或删除下游不需要的字段时,在两个节点之间添加它即可。
节点间的数据映射
数据映射是指将一个节点的输出连接到另一个节点的输入。在 n8n 的界面中,你可以将一个字段直接拖到目标参数上,n8n 会自动为你写入表达式。但理解它所生成的内容有助于在出现问题时进行修复。
当一个节点返回多个项目时,$json 在 n8n 进行迭代时会分别指向每个项目。因此,如果你的上一个节点返回了 50 行数据,每个表达式都会被求值 50 次——每个项目一次。这是默认行为,无需额外配置。
如果需要将所有项目聚合为一个结构——例如,从所有行构建一个电子邮件数组——请使用带有 $input.all() 的 Code 节点。
Code 节点运行完整的 JavaScript 代码,当字段参数内的表达式变得过于复杂而难以阅读时,它是正确的工具选择。
常见错误及其避免方法
最常见的错误是引用了不存在的字段,这会返回 undefined 并可能在悄无声息地中断下游节点。务必使用表达式编辑器的预览面板——它会在你保存之前显示已解析的值。
第二个常见问题是忘记 $json 指向的是当前节点的输入,而非其输出。如果你正位于 Set 节点中,并且需要来自前两步的数据,请改用 $node["NodeName"].json。
第三个错误是将 $now 视为普通字符串。它是一个 Luxon 对象,因此直接将其与日期字符串进行比较是行不通的。请先将两侧转换为相同的类型。
小结
表达式是 n8n 工作流变得动态的核心机制。核心模式——双花括号包裹一个从 node 或 $now 读取数据的 JavaScript 表达式——足以应对大多数场景。对于简单的字段映射和重命名,请使用 Set 节点;当逻辑变得复杂时,则升级到 Code 节点。在运行实时工作流之前,请始终在预览面板中验证表达式。
课程检查点
巩固所学知识,获取作业反馈。