简介
在 n8n 中,表达式是原始数据与动态逻辑之间的桥梁。你无需硬编码值,而是编写表达式来读取前一个节点的数据、应用转换,并将结果传递给下一步——这一切都无需编写完整的 Code 节点。
n8n 中的每个表达式都用双花括号包裹,并在运行时进行求值。其底层引擎是一个轻量级的 JavaScript 环境,提供一组内置变量和辅助方法。理解这一层,是区分脆弱工作流与真正能处理真实数据的工作流的关键。
表达式语法与内置变量
你最常使用的两个最重要的内置变量是 $json 和 json 指向当前正在处理项的 JSON body。$input 让你能够访问完整的输入对象,包括引用同一次运行中其他项的能力。
要引用当前项中的某个字段:
要按名称引用特定前一个节点的输出:
要访问批处理中当前项的索引:
要获取传入当前节点的总项数:
这些变量在几乎所有显示表达式切换的字段中都可用——输入字段、Set 节点值、IF 条件、HTTP Request 参数等等。
![流程图,展示 $json、$input 和 $node[] 变量如何映射到三个顺序节点之间流动的数据](https://cdn.sanity.io/images/hs5ychob/production/128a55775589bf44de5fabf9d31ce80937411b92-1344x768.jpg?w=1200&q=75&auto=format&fit=max)
使用表达式转换数据
除了简单的字段访问,表达式还支持完整的 JavaScript 字符串、数组和对象 API。这正是无需专用 Code 节点就能进行内联转换的地方。
将字符串转换为大写:
去除空格并检查条件:
从多个字段构建格式化字符串:
使用内置的 $now 和 Luxon 集成解析日期并重新格式化:
n8n 内置了用于日期处理的 Luxon。你可以在任何表达式中直接将其引用为 DateTime——无需导入。
使用可选链安全地访问嵌套字段:
这种模式——可选链加上空值合并——在你的上游数据不一致时至关重要。它能防止表达式抛出错误而导致整个执行中断。
在表达式中使用数组
当一个节点输出多个项时,你有时需要从下游表达式中对它们进行聚合或过滤。$input.all() 让你获得完整的项数组,这些项都是带有 json 属性的对象。
获取批处理中每个项的 email 组成一个数组:
过滤出满足字段条件的项并计数:
对所有项的某个数值字段求和:
这些表达式在 Set 节点或 Merge 节点中非常适用,当你希望在将批数据向下游传递之前,从中生成一个单一的聚合值时。
常见错误
最常见的问题是引用了在某些项上不存在的字段。表达式会抛出 TypeError,执行随即停止。当字段不能保证存在时,请务必使用可选链。
另一个常见错误是忘记 $json 指的是当前项,而不是节点的整个输出。如果一个节点输出了五项,而你用 $json.value 处理它们,每一项都会被独立处理——你得到的不是五个值的数组,而是每次执行得到的一个值。
混淆 $node["NodeName"].json 和 node[] 无论当前执行路径如何,都会锁定到特定节点的最后一次输出,这可能在分支工作流中返回过时数据。请有意识地、谨慎地使用它。
最后,避免在单个表达式中放入复杂的多步逻辑。一旦你需要超过两个链式操作或带有副作用的循环,就将该逻辑移入 Code 节点。表达式用于转换,而非用于控制流。
总结
n8n 中的表达式让你能够使用 input 和 $node[] 作为主要访问点,动态地读取、转换和组合数据。JavaScript 的字符串、数组和日期方法在双花括号内原生可用,Luxon 可用于日期格式化。可选链和空值合并等安全访问模式让你的工作流对不一致的上游数据具有韧性。当转换逻辑超出几个链式操作的范畴时,Code 节点才是合适的工具——其他一切都可以由表达式覆盖。
课程检查点
巩固所学知识,获取作业反馈。