还在为 n8n 里的数字计算头疼?别再用笨办法了!
笔者在 N8N大学 社区里潜水时,发现很多新手朋友在处理数据时,总喜欢拖好几个节点出来做加减乘除。比如,算个订单利润,要先用 Set 节点存单价,再用 Math 节点算总价,最后还得格式化一下。
累不累?太累了。这种“堆叠式”工作流不仅拖慢了运行速度,后期维护起来更是噩梦。其实,n8n 的表达式引擎内置了强大的 JavaScript 能力,特别是 Math 对象,能让你一行代码搞定复杂运算。今天,咱们就来聊聊怎么用这把“瑞士军刀”给你的工作流瘦身。
核心概念:表达式里的 Math 到底是什么?
简单来说,n8n 的表达式(Expression)就是一个微型的 JavaScript 运行环境。当你在输入框里输入 {{ 时,你就拥有了 JavaScript 的全部原生能力。
而 Math 对象是 JavaScript 的内置对象,它不是一个需要你手动引入的库,而是“开箱即用”的工具箱。你可以用它来做取整、求最大值、算百分比,甚至生成随机数。掌握它,你就掌握了 n8n 的“计算内核”。
实战演练:用 Math 让你的工作流“飞”起来
光说不练假把式。下面笔者带你通过三个常见的实战场景,看看 Math 函数到底有多香。
1. 四舍五入与取整:告别小数点的烦恼
场景:你从 API 拉回来的数据是 19.999999,你想把它变成 20.00,或者直接变成整数 20。
以前你可能得拖个格式化节点,现在直接在表达式里写:
- 保留两位小数:
{{ Math.round(19.999999 * 100) / 100 }}或者更优雅的{{ $json.price.toFixed(2) }}(虽然toFixed是 Number 的方法,但常与 Math 配合使用)。 - 向上取整(进一法): 比如算服务器数量,
{{ Math.ceil(4.1) }}结果直接是5。 - 向下取整:
{{ Math.floor(4.9) }}结果是4。
笔者建议:涉及金额计算时,直接用 toFixed(2) 处理,避免浮点数精度坑。
2. 比较大小:谁最大?谁最小?
场景:你需要找出一组数据中的最大值或最小值,比如监控多个服务器的响应时间,找出最慢的那个。
别写复杂的循环逻辑,直接用 Math.max() 和 Math.min()。
假设你的输入数据是一个数组:[10, 55, 23, 88],在表达式中可以这样写:
{{ Math.max(10, 55, 23, 88) }}
如果数据在上一个节点的字段里,比如 times 字段,你可以结合扩展运算符(...):
{{ Math.max(...$json.times) }}
这行代码能瞬间返回 88,效率极高。
3. 随机数生成:模拟数据与抽样神器
场景:你需要测试工作流,或者给用户发一个随机的验证码/折扣码。
这里要用到 Math.random()。它会返回一个 0 到 1 之间的浮点数。我们通常需要配合 Math.floor()</code) 来取整。
生成一个 1 到 100 的随机整数:
{{ Math.floor(Math.random() * 100) + 1 }}
这个公式是 n8n 开发者的“老熟人”了,记下来,以后做随机抽样、生成 mock 数据都能用得上。
避坑指南:新手最容易踩的两个坑
虽然 Math 很好用,但表达式里的 JavaScript 和纯写代码还是有点区别的。笔者这里必须提醒两个点:
1. 数据类型陷阱: n8n 表达式里的数字有时候会被识别成字符串。如果你发现计算结果变成了拼接字符串(比如 "10" + "20" = "1020"),请务必使用 Number() 强制转换一下。
写法:{{ Number($json.fieldA) + Number($json.fieldB) }}
2. 空值(Null)报错: 如果你计算的字段可能是空的,直接丢给 Math 会报错导致整个节点运行失败。在 n8n 的新版表达式中,推荐使用 可选链(Optional Chaining) 或者三元表达式做保护。
稳健写法:{{ $json.price ? Math.round($json.price) : 0 }}
这样即使没取到值,工作流也不会崩,而是返回一个默认值 0。
FAQ:你可能还想问
Q1: 在 n8n 表达式里能用 Math 库的其他函数吗?比如三角函数?
A: 完全可以!只要是 JavaScript 标准 Math 对象支持的函数,比如 Math.sin(), Math.pow(), Math.sqrt() 等,都能直接用。虽然在办公自动化场景用得少,但在处理地理计算等特殊场景时非常有用。
Q2: 我想计算日期之间的天数差,可以用 Math 吗?
A: 可以,但有点复杂。通常做法是把两个日期转为时间戳(毫秒数),相减后再除以 86400000(一天的毫秒数),最后用 Math.floor 取整。当然,n8n 也有专门的日期处理库,看个人习惯。
Q3: 表达式太长了,看着眼花怎么办?
A: 如果计算逻辑非常复杂,建议在 n8n 中使用 Code 节点(Code Node)来写 JavaScript 代码,处理完后再传给后续节点。表达式更适合短小精悍的计算。
总结与资源
在 n8n 中使用 Math 对象,是迈向高级用户的第一步。它能让你的工作流更加简洁、高效,减少对冗余节点的依赖。记住,表达式就是你的武器库,而 Math 是其中最锋利的一把刀。
如果你在 n8n 的学习路上还有其他疑问,欢迎常来 N8N大学 (n8ndx.com) 转转。这里没有枯燥的文档,只有能落地的实战经验和避坑指南。我是你的主编,咱们下期见。